classTrieNode:"""A node in the trie structure"""def__init__(self,char):self.char=charself.is_end=Falseself.counter=0self.children={}classTrie:"""The trie object"""def__init__(self):self.root=TrieNode("")definsert(self,word):node=self.rootforcharinword:ifcharinnode.children:node=node.children[char]else:new_node=TrieNode(char)node.children[char]=new_nodenode=new_nodenode.is_end=Truenode.counter+=1defdfs(self,node,prefix):ifnode.is_end:self.output.append((prefix+node.char,node.counter))forchildinnode.children.values():self.dfs(child,prefix+node.char)defquery(self,x):self.output=[]node=self.rootforcharinx:ifcharinnode.children:node=node.children[char]else:return[]self.dfs(node,x[:-1])returnsorted(self.output,key=lambdax:x[1],reverse=True)