Cod sursa(job #306549)

Utilizator tibiletsKoos Tiberiu Iosif tibilets Data 21 aprilie 2009 12:07:43
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<fstream.h>
inline short i(char *c)
{return c[0]-'a';}
struct trie
{int cuv,pref;
 trie *f[26];};
void init(trie *t)
{t->cuv=t->pref=0;
 memset(t->f,0,sizeof(t->f));}
trie *T=new trie;
void ad(trie *t,char *c)
{if(!c[0])
  ++t->cuv;
 else
 {short x=i(c);
  if(!t->f[x])
  {t->f[x]=new trie;
   init(t->f[x]);
   ++t->pref;
  }
  ad(t->f[x],c+1);
 }
}
int ste(trie *t,char *c)
{if(!c[0])
  --t->cuv;
 else
  if(ste(t->f[i(c)],c+1))
  {t->f[i(c)]=0;
   --t->pref;}
 if(!t->cuv&&!t->pref&&t!=T)
 {delete t;
  return 1;}
 return 0;
}
int apar(trie *t,char *c)
{if(!c[0])
  return t->cuv;
 short x=i(c);
 if(t->f[x])
  return apar(t->f[x],c+1);
 return 0;
}
int pref(trie *t,char *c,int l)
{short x=i(c);
 if(!c[0]||!t->f[x])
  return l;
 return pref(t->f[x],c+1,l+1);
}
int main()
{ifstream f("trie.in");
ofstream g("trie.out");
char x[25];
short o,l;
init(T);
while(f>>o)
{f.get(x,25);f.get();
 switch(o)
 {case 0:ad(T,x+1);break;
  case 1:ste(T,x+1);break;
  case 2:g<<apar(T,x+1)<<'\n';break;
  case 3:g<<pref(T,x+1,0)<<'\n';break;
 }
}
return 0;
}