Cod sursa(job #765395)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 iulie 2012 13:48:30
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<cstdio>
typedef struct T
{int c,n;
struct T *f[26];};
int p;
char l[32];
T *t;

T *B()
{T *t=new T;
t->c=t->n=0;
for(int i=0;i<26;i++)
      t->f[i]=NULL;
return t;}

void A(T *s,char *l) 
{if(*l=='\0') 
        {++s->c;
        return;}
if(!s->f[(*l)-'a']) 
        s->f[(*l)-'a']=B(),++s->n;
A(s->f[(*l)-'a'],l+1);}
            
int D(T *s,char *l) 
{if(*l=='\0') 
        --s->c;
else 
        if(D(s->f[(*l)-'a'],l+1)) 
               s->f[(*l)-'a']=0,--s->n;
if(!(s->c)&&!(s->n)&&s!=t) 
      {delete s;
      return 1;}
return 0;}
        
int C(T *s,char *l) 
{if(*l=='\0') 
        return s->c;
if(s->f[(*l)-'a']) 
        return C(s->f[(*l)-'a'],l+1);
return 0;}

int E(T *s,char *l,int k) 
{if(*l=='\0'||!s->f[(*l)-'a']) 
       return k;
return E(s->f[(*l)-'a'],l+1,k+1);}

int main()
{freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(!feof(stdin)) 
     {printf("%d ",&p),gets(l);
     if(feof(stdin))
            break;
     if(!p) 
            A(t,l);
     if(p==1) 
            t=B(),D(t,l);
     if(p==2)
             printf("%d\n",C(t,l));
     if(p==3) 
             printf("%d\n",E(t,l,0));}
return 0;}