classNode:def__init__(self,text):
self.text = text
self.last = 0self.output = ""self.child = {}
self.fail = None
self.rank = 0defshow(self):
print( "text:", self.text, "output:",self.output, "fail:", self.fail.text ifself.fail is not None else"None","rank:",self.rank)
ifself.last:
print( "LAST OUTPUT : ", self.output)
for k inself.child.keys():
s = self.child[k]
s.show()
classAhocorasickTrie:def__init__(self):
self.no = 0
self.root = Node(None)
defadd(self,text):
rank = 0
currentNode = self.root
for t in text:
if t notin currentNode.child:
self.no +=1
currentNode.child[t] = Node(t)
print(f"ADD : {t} || Current No. : {self.no}")
currentNode.rank = rank
rank+=1
currentNode = currentNode.child[t]
currentNode.output = text
currentNode.last = 1
currentNode.rank = rank
print(f"TOTAL : {self.no}")
defset_failur(self):
queue = []
for c,node in self.root.child.items():
node.fail = self.root
queue.append(node)
while queue:
currentNode = queue.pop(0)
for t,node in currentNode.child.items():
fail_node = currentNode.fail
while fail_node and t notin fail_node.child:
fail_node = fail_node.fail
if fail_node:
node.fail = fail_node.child[t]
else:
node.fail = self.root
queue.append(node)
defshow(self):
self.root.display()
deffind(self,text):
result = []
currentNode = self.root
for t in text:
while currentNode isnotNoneand t notin currentNode.child:
print("fail",currentNode.text)
currentNode = currentNode.fail
if t in currentNode.child:
currentNode = currentNode.child[t]
if currentNode.output != "":
result += [currentNode.output]
print(result,t,currentNode.output,currentNode.last,currentNode.output)
return result
classNode:def__init__(self,text):
self.text = text
self.last = 0
self.child = {}
classTrie:def__init__(self):
self.no = 0
self.root = Node(None)
defadd(self,text):
currentNode = self.root
for t in text:
if t notin currentNode.child:
self.no +=1
currentNode.child[t] = Node(t)
print(f"ADD : {t} || Current No. : {self.no}")
currentNode = currentNode.child[t]
currentNode.last = 1print(f"TOTAL : {self.no}")
deffind(self,text):
result = ""
currentNode = self.root
for t in text:
if t in currentNode.child:
result += t
currentNode = currentNode.child[t]
return result