Cod sursa(job #2630222)

Utilizator StasBrega Stanislav Stas Data 24 iunie 2020 19:10:52
Problema Trie Scor 50
Compilator py Status done
Runda Arhiva educationala Marime 1.32 kb
class TrieNode:
    def __init__(self):
        self.fin = 0
        self.nr = 0
        self.fiu = [None]*26


def fc(ch):
    return ord(ch) - ord('a')


def ins(node, s, k):
    if k == len(s):
        node.fin += 1
        return 0
    i = fc(s[k])
    if not node.fiu[i]:
        node.fiu[i] = TrieNode()
        node.nr += 1
    ins(node.fiu[i], s, k + 1)


def delete(node, s, k):
    if k == len(s):
        node.fin -= 1
    elif delete(node.fiu[fc(s[k])], s, k + 1):
        node.fiu[fc(s[k])] = None
        node.nr -= 1
    if node.fin == 0 and node.nr == 0 and node != T:
        return 1
    return 0


def find(node, s, k):
    if k == len(s):
        return node.fin
    i = fc(s[k])
    if node.fiu[i]:
        return find(node.fiu[i], s, k + 1)
    return 0


def pref(node, s, k):
    if k == len(s) or not node.fiu[fc(s[k])]:
        return k
    return pref(node.fiu[fc(s[k])], s, k + 1)


T = TrieNode()

with open("trie.in", "r") as file, open("trie.out", "w") as g:
    try:
        while 1:
            op, st = next(file).split()
            if op == '0': ins(T, st, 0)
            elif op == '1': delete(T, st, 0)
            elif op == '2': g.write(str(find(T, st, 0)) + '\n')
            elif op == '3': g.write(str(pref(T, st, 0)) + '\n')
    except:
        pass