Cod sursa(job #605531)

Utilizator SpiderManSimoiu Robert SpiderMan Data 30 iulie 2011 16:59:25
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
# include <cstdio>
# include <cstring>

const char *FIN = "trie.in", *FOU = "trie.out";

char S[30];

struct trie {
    int fii, cuv;
    trie *fiu[26];

    trie () {
        fii = cuv = 0;
        memset (fiu, 0, sizeof (fiu));
    }
};

trie *T = new trie;

void ins (trie *nod, char *S) {
    if (*S == '\n') {
        nod -> cuv++;
        return ;
    }
    if (nod -> fiu[*S - 'a'] == 0) {
        nod -> fiu[*S - 'a'] = new trie;
        nod -> fii++;
    }
    ins (nod -> fiu[*S - 'a'], S + 1);
}

int del (trie *nod, char *S) {
    if (*S == '\n') nod -> cuv--;
    else if (del (nod -> fiu[*S - 'a'], S + 1)) {
        nod -> fiu[*S - 'a'] = 0, nod -> fii--;
    }
    if (nod -> cuv == 0 && nod -> fii == 0 && nod != T) {
        delete nod;
        return 1;
    }
    return 0;
}

int count (trie *nod, char *S) {
    if (*S == '\n')
        return nod -> cuv;
    if (nod -> fiu[*S - 'a'])
        return count (nod -> fiu[*S - 'a'], S + 1);
    return 0;
}

int prefx (trie *nod, char *S, int val) {
    if (*S == '\n' || nod -> fiu[*S - 'a'] == 0)
        return val;
    return prefx (nod -> fiu[*S - 'a'], S + 1, val + 1);
}

int main (void) {
    freopen (FIN, "r", stdin);
    freopen (FOU, "w", stdout);

    for (; fgets (S, 30, stdin) ;) {
        if (S[0] == '0') ins (T, S + 2);
        if (S[0] == '1') del (T, S + 2);
        if (S[0] == '2') printf ("%d\n", count (T, S + 2));
        if (S[0] == '3') printf ("%d\n", prefx (T, S + 2, 0));
    }
}