Cod sursa(job #815121)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 16 noiembrie 2012 17:13:52
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include<cstdio>
using namespace std;
struct trie
{
    trie *N[26];
    int S,C;
    trie()
    {
        C=S=0;
        for(int i=0;i<26;i++) N[i]=0;
    }
};
trie *R,*Q,*ST[30],*X;
char line[33],*p;
int i,q;
void insertWord(char *cuv)
{
    for(p=cuv,q=0,Q=R;*p;p++,q++)
    {
        if(!('a'<=*p&&*p<='z')) break;
        i=*p-'a';
        ST[q]=Q;
        if(!Q->N[i]) Q->N[i]=new trie;
        Q=Q->N[i];
    }
    ST[q]=Q;
    for(i=0;i<q;i++) ST[i]->S++;
    ST[q]->C++;
}
void deleteWord(char *cuv)
{
    for(p=cuv,q=0,Q=R;*p;p++,q++)
    {
        if(!('a'<=*p&&*p<='z')) break;
        i=*p-'a';
        ST[q]=Q;
        if(!Q->N[i]) Q->N[i]=new trie;
        Q=Q->N[i];
    }
    ST[q]=Q;
    for(i=0;i<q;i++) ST[i]->S--;
    ST[q]->C--;
    for(i=q-1;i>=0;i--)
    {
        if(ST[i+1]->C+ST[i+1]->S) break;
        X=ST[i+1];
        ST[i+1]=0;
        ST[i]->N[cuv[i]-'a']=0;
        delete X;
    }
}
void writeAppearances(char *cuv)
{
    for(p=cuv,Q=R;*p;p++)
    {
        if(!('a'<=*p&&*p<='z')) break;
        i=*p-'a';
        Q=Q->N[i];
        if(!Q) break;
    }
    if(!(Q==0||Q==R)) printf("%d\n",Q->C);
    else printf("0\n");
}
void writePrefix(char *cuv)
{
    int lenght=0;
    for(p=cuv,Q=R;*p;p++)
    {
        if(!('a'<=*p&&*p<='z')) break;
        i=*p-'a';
        Q=Q->N[i];
        if(!Q) break;
        lenght++;
    }
    printf("%d\n",lenght);
}
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    R=new trie;
    fgets(line,32,stdin);
    while(!feof(stdin))
    {
        switch(line[0]-'0')
        {
            case 0: {insertWord(line+2); break;}
            case 1: {deleteWord(line+2); break;}
            case 2: {writeAppearances(line+2); break;}
            case 3: {writePrefix(line+2); break;}
        }
        fgets(line,32,stdin);
    }
    return 0;
}