Pagini recente » Cod sursa (job #3042079) | Rezultatele filtrării | Cod sursa (job #1687044) | Cod sursa (job #1601640) | Cod sursa (job #306549)
Cod sursa(job #306549)
#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;
}