Cod sursa(job #244259)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 14 ianuarie 2009 20:05:35
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>
#include <string.h>
long t,l,q,max,cuv[100002];char ch[32];
struct trie{int f[26];};
trie next[100002];

void add(int nod, char ch[32]){
   if (ch[0]==0){cuv[nod]++;return;}
   long k=ch[0]-'a';
   if (next[nod].f[k]>0)add(next[nod].f[k],ch+1);
   else {next[nod].f[k]=++q; add(q,ch+1);}
}
void del(int nod, char ch[32]){
   if (ch[0]==0){cuv[nod]--;return;}
   long k=ch[0]-'a';
   del(next[nod].f[k],ch+1);
}
void count(int nod, char ch[32]){
   if (ch[0]==0){printf("%ld\n",cuv[nod]);return;}
   long k=ch[0]-'a';
   count(next[nod].f[k],ch+1);
}
void prefix(int nod, int l, char ch[32]){
   int i;
   if (ch[0]==0){
     for (int i=0;i<26;++i)if (next[nod].f[i])max=l;
     //if (cuv[nod]>1)max=l;
     printf("%ld\n",max-1);
     return;
   }
   long k=ch[0]-'a';
   for (int i=0;i<26;++i)if (i!=k&&next[nod].f[i])max=l;
   if (cuv[nod]>0)max=l;
   prefix(next[nod].f[k],l+1,ch+1);
}

int main(){
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    do{
       t=-1; scanf("%ld %s\n",&t,ch);
       if (t==-1)break;
       if (t==0)add(1,ch);
       if (t==1)del(1,ch);
       if (t==2)count(1,ch);
       if (t==3){max=0;prefix(1,1,ch);}
    }while(1);
return 0;
}