Cod sursa(job #244356)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 14 ianuarie 2009 22:09:35
Problema Trie Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <stdio.h>
#include <string.h>
long t,l,q,ok,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]--;
      if (cuv[nod]>0)ok=0;
      for (int i=0;i<26;++i)if (next[nod].f[i])ok=0;
      return;
   }
   long k=ch[0]-'a';
   del(next[nod].f[k],ch+1);
   if (ok)next[nod].f[k]=0;
   if (cuv[nod])ok=0;
}
void count(int nod, char ch[32]){
   if (nod==0){printf("0\n");return;}
   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]){
   if (nod==0){printf("%ld\n",l-1);return;}
   if (ch[0]==0){printf("%ld\n",l);return;}
   long k=ch[0]-'a';
   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){ok=1;del(1,ch);}
       if (t==2)count(1,ch);
       if (t==3)prefix(1,0,ch);
    }while(1);
return 0;
}