Cod sursa(job #2449272)

Utilizator voyagerSachelarie Bogdan voyager Data 19 august 2019 02:55:51
Problema Trie Scor 0
Compilator py Status done
Runda Arhiva educationala Marime 1.41 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 len(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 len(w):
            idx = letCode(w[0])
            self.links[idx].remove(w[1:])
            if self.links[idx].cnt == 0:
                del self.links[idx]

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

    def add(w):
        Trie.add(w)

    def remove(w):
        Trie.remove(w)

    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[:-1])):
            node = node.links[c]
            if node is None: break
            if node.cnt > 0: lg = i + 1

        return lg

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