Cod sursa(job #664114)
#include<fstream>
#include<string.h>
#include<stdlib.h>
using namespace std;
char sir[30];int maxim=0,nr=0;
struct arb
{
int info,nrfii;
arb*fiu[26];
arb()
{
for(int i=0;i<=26;i++)fiu[i]=0;
info=0;
nrfii=0;
}
}*trie;
void insereaza(arb *nd,char *s)// if(fiu[i]) <=> am muchie cu litera *s-'a',adica fiu[3]<=> am muchie cu 'b'
{
if(*s)
{
if(!nd->fiu[*s-'a']) { nd->nrfii++; nd->fiu[*s-'a']=new arb; }
insereaza(nd->fiu[*s-'a'],s+1);
}
else
{
nd->info++;
return;
}
}
void sterge(arb *nd,char *s)
{
if(*s)
sterge(nd->fiu[*s-'a'],s+1);
else
nd->info--;
}
long numara(arb *nd,char *s)//numarul de aparitii ale lui s
{
if(*s && nd->fiu[*s-'a'] )return numara(nd->fiu[*s-'a'],s+1);
else
return nd->info;
}
int lungime( arb *nd,char *s,int k)
{
if(*s=='\n'||nd->fiu[*s-'a']==0)
return k;
return lungime( nd->fiu[*s-'a'], s+1, k+1 );
}
int main()
{
ifstream f("trie.in");ofstream g("trie.out");
trie=new arb;
while(f.getline(sir,30))
{
if(sir[0]=='0')insereaza(trie,sir+2);
else
if(sir[0]=='1')sterge(trie,sir+2);
else
if(sir[0]=='2')g<<numara(trie,sir+2)<<"\n";
else
if(sir[0]=='3')g<<lungime(trie,sir+2,0)<<"\n";
}
f.close();g.close();
return 0;}