Mai intai trebuie sa te autentifici.

Cod sursa(job #808545)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 6 noiembrie 2012 21:38:39
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<cstdio>
using namespace std;
struct trie
{
    trie *N[26];
    int S,C;
    trie()
    {
        for(int i=0;i<26;i++) N[i]=0;
    }
};
trie *A,*R,*Q,*ST[100010];
char line[33],*p;
int i,j;
void insertWord(char *cuv)
{
    for(p=cuv,Q=R;*p;p++)
    {
        i=*p-'a';
        if(!Q->N[i]) Q->N[i]=new trie;
        Q=Q->N[i];
        Q->S++;
    }
    Q->C++;
}
void deleteWord(char *cuv)
{
    j=0;
    for(p=cuv,Q=R;*p;p++)
    {
        i=*p-'a';
        Q=Q->N[i];
        ST[++j]=Q;
        Q->S--;
    }
    Q->C--;
    for(;j;)
    {
        if(!ST[j]->S)
        {
            ST[j-1]->N[cuv[j-1]-'a']=0;
            j--;
            delete ST[j];
        }
        else break;
    }
}
void writeAppearances(char *cuv)
{
    for(p=cuv,Q=R;*p;p++)
    {
        i=*p-'a';
        Q=Q->N[i];
        if(!Q) break;
    }
    if(Q) printf("%d\n",Q->C);
    else printf("0\n");
}
void writePrefix(char *cuv)
{
    int lenght=0;
    for(p=cuv,Q=R;*p;p++)
    {
        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;
    while(!feof(stdin))
    {
        fgets(line,32,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;}
        }
    }
    return 0;
}