Pagini recente » Cod sursa (job #2418882) | Cod sursa (job #28210) | Cod sursa (job #172802) | Cod sursa (job #1789917) | Cod sursa (job #2075129)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie
{
int sf=0,nrfii=0;
Trie *fiu[26];
Trie()
{
memset( fiu, 0, sizeof( fiu ) );
}
};
Trie *T = new Trie;
void Adaugare (Trie *nod, char *s)
{
if (*s=='\0')
{
nod->sf++;
return;
}
if (nod->fiu[*s-'a']==0)
{
nod->fiu[*s-'a'] = new Trie;
nod->nrfii++;
}
Adaugare(nod->fiu[*s-'a'],s+1);
}
bool Stergere (Trie *nod, char *s)
{
if (*s=='\0')
{
nod->sf--;
}
else if (Stergere(nod->fiu[*s-'a'],s+1))
{
nod->fiu[*s-'a']=0;
nod->nrfii--;
}
if (nod!=T && nod->nrfii==0 && nod->sf==0)
{
delete nod;
return 1;
}
return 0;
}
int NrApp(Trie *nod,char *s)
{
if (*s=='\0')
return nod->sf;
if (nod->fiu[*s-'a'])
return NrApp(nod->fiu[*s-'a'],s+1);
return 0;
}
int Prefix (Trie *nod, char *s, int depth=0)
{
if (*s=='\0' || nod->fiu[*s-'a']==0)
return depth;
return Prefix(nod->fiu[*s-'a'],s+1,depth+1);
}
int main()
{
freopen ("trie.in","r",stdin);
freopen ("trie.out","w",stdout);
int op;
char a[20];
while(1)
{
scanf("%d ",&op);
cin.getline(a,20);
if (a[0]==0)
break;
if (op==0)
{
Adaugare(T,a);
}
else if (op==1)
{
Stergere(T,a);
}
else if (op==2)
{
cout<<NrApp(T,a)<<endl;
}
else if (op==3)
{
cout<<Prefix(T,a)<<endl;
}
}
return 0;
}