Cod sursa(job #781361)

Utilizator my666013Test Here my666013 Data 24 august 2012 11:56:39
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <cctype>

struct arb{
    struct arb *f[26];
    int p,nr; }*t;

void add(char *b){
    arb * g = t;
    int urm;
    while( isalpha(*b) )
    {
        urm = *b - 'a';
        if(g->f[urm] == 0)g->f[urm] = new arb;
        g = g->f[urm];
        g->p++;
        b++;
    }
        g->nr++;
}

void remove(char *b){
    arb * g = t;
    int urm;
    while( isalpha(*b) )
    {
        urm = *b - 'a';
        g = g->f[urm];
        g->p--;
        b++;
    }
        g->nr--;
}

int aparitii(char *b){
    arb * g = t;
    int urm;
    while( isalpha(*b) )
    {
        urm = *b - 'a';
        if(g->f[urm] == 0)return 0;
        g = g->f[urm];
        b++;
    }
        return g->nr;
}

int prefix(char *b){
    arb * g = t;
    int urm, l = 0;
    while( isalpha(*b) )
    {
        urm = *b - 'a';
        if(g->f[urm] == 0)return l;
        g = g->f[urm];
        if(g->p < 1)return l; else
        b++;
        l++;
    }
        return l;
}

int main(){
    int c;
    char a[25];

    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);

    t = new arb;

    while( scanf("%d %s ",&c,a) != -1 )
    {
        switch(c)
        {
            case 0 : add(a); break;
            case 1 : remove(a); break;
            case 2 : printf("%d\n",aparitii(a)); break;
            case 3 : printf("%d\n",prefix(a)); break;
        }
    }


    return 0;
}