Cod sursa(job #2449280)

Utilizator voyagerSachelarie Bogdan voyager Data 19 august 2019 04:21:57
Problema Trie Scor 45
Compilator py Status done
Runda Arhiva educationala Marime 1.32 kb
#!/usr/bin/env python3

import sys
sys.stdout = open('trie.out', 'w')

def letCode(let): return ord(let) - ord('a')

class Node(object):
    def __init__(self):
        self.cnt = 0
        self.links = [None] * 27

    def add(self, w):
        self.cnt += 1
        if w:
            idx = letCode(w[0])
            if self.links[idx] is None:
                self.links[idx] = Node()
            self.links[idx].add(w[1:])

    def remove(self, w):
        self.cnt -= 1
        if w:
            idx = letCode(w[0])
            self.links[idx].remove(w[1:])
            if self.links[idx].cnt == 0:
                self.links[idx] = None

with open('trie.in', 'r') as f:
    Trie = Node()

    def freq(w):
        node = Trie
        for c in map(letCode, w):
            node = node.links[c]
            if node is None: return 0
        return node.cnt

    def longestPrefixLen(w):
        lg, node = 0, Trie
        for i, c in enumerate(map(letCode, w)):
            node = node.links[c]
            if node is None: break
            if node.cnt: lg = i + 1
        return lg

    for line in f:
        op = tuple(line.split())
        if op[0] == '0': Trie.add(op[1] + '{')
        elif op[0] == '1': Trie.remove(op[1] + '{')
        elif op[0] == '2': print(freq(op[1] + '{'))
        elif op[0] == '3': print(longestPrefixLen(op[1]))