Cod sursa(job #1115861)

Utilizator PatrikStepan Patrik Patrik Data 22 februarie 2014 09:52:11
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int t  , N;
    char s[22];
    struct nod
    {
        int cuv , pre;
        nod *fiu[26];
        nod()
        {
            cuv = pre = 0;
            memset(fiu,0,sizeof(fiu));
        }
    };
    nod *rad = new nod();

    void add(nod *q, int i);
    int query(nod *q , int i);
    void del(nod *q , int i);
    int prefix(nod *q, int i,int k);

    int main()
    {
        freopen("trie.in" , "r" , stdin );
        freopen("trie.out" , "w" , stdout );
        while(scanf("%d %s" , &t , s+1) >0)
        {
            N = strlen(s+1);
            if(t == 0)add(rad,0);
            if(t == 1)del(rad,0);
            if(t == 2)printf("%d\n" , query(rad,0));
            if(t == 3)printf("%d\n" , prefix(rad,0,0));
        }
        return 0;
    }

    void add(nod *q, int i)
    {
        if(q != rad)q->pre++;
        if(i == N){q->cuv++;return;}
        if(!q->fiu[s[i+1]-'a'])q->fiu[s[i+1]-'a'] = new nod();
        add(q->fiu[s[i+1]-'a'],i+1);
    }

    int query(nod *q , int i)
    {
        if(!q)return 0;
        if(i == N)return q->cuv;
        return query(q->fiu[s[i+1]-'a'],i+1);
    }

    void del(nod *q ,int i)
    {
        if(q != rad)q->pre--;
        if(i == N)q->cuv--;
        if(i < N)del(q->fiu[s[i+1]-'a'],i+1);
    }

    int prefix(nod *q,int i, int k)
    {
        if(i == N || !q -> fiu[s[i+1]-'a'] || !q->fiu[s[i+1]-'a']->pre)return k;
        return prefix(q->fiu[s[i+1]-'a'],i+1, k+1);
    }