Pagini recente » Cod sursa (job #246451) | Cod sursa (job #728558) | Cod sursa (job #2525583) | Cod sursa (job #1677052) | Cod sursa (job #2375987)
#include <fstream>
#define mmax 20
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char aux[mmax+5];
int op;
struct trie
{
int fii,aparitii;
trie *fiu[26];
trie()
{
fii=aparitii=0;
for(int i=0;i<26;i++)
fiu[i]=NULL;
}
}*root;
void adauga(trie *nod,char *s)
{
if(*s==NULL)
{
nod->aparitii++;
return ;
}
if(nod->fiu[*s-'a']==NULL)
{
nod->fiu[*s-'a']=new trie;
nod->fii++;
}
adauga(nod->fiu[*s-'a'],s+1);
}
void sterge(trie *nod, char *s)
{
if(*s==NULL)
{
nod->aparitii--;
return;
}
sterge(nod->fiu[*s-'a'],s+1);
if(nod->fiu[*s-'a']->aparitii==0 && nod->fiu[*s-'a']->fii==0)
{
delete nod->fiu[*s-'a'];
nod->fiu[*s-'a']=0;
nod->fii--;
}
}
int tipar(trie *nod, char *s)
{
if(*s==NULL)
return nod->aparitii;
if(!nod->fiu[*s-'a'])
return 0;
return tipar(nod->fiu[*s-'a'],s+1);
}
int prefix(trie *nod, char *s)
{
if(*s==NULL)
return 0;
if(!nod->fiu[*s-'a'])
return 0;
return prefix(nod->fiu[*s-'a'],s+1)+1;
}
int main()
{
root=new trie;
while(fin>>op>>aux)
switch(op)
{
case 0:
adauga(root,aux);
break;
case 1:
sterge(root,aux);
break;
case 2:
fout<<tipar(root,aux)<<"\n";
break;
case 3:
fout<<prefix(root,aux)<<"\n";
}
return 0;
}