Pagini recente » Cod sursa (job #1799926) | Cod sursa (job #341596) | Cod sursa (job #2702601) | Cod sursa (job #621585) | Cod sursa (job #2075108)
#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=='\n')
{
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=='\n')
{
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=='\n')
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=='\n' || 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[50];
while(1)
{
fgets(a,50,stdin);
if (a[0]=='\n')
break;
if (a[0]=='0')
{
Adaugare(T,a+2);
}
if (a[0]=='1')
{
Stergere(T,a+2);
}
if (a[0]=='2')
{
cout<<NrApp(T,a+2)<<endl;
}
if (a[0]=='3')
{
cout<<Prefix(T,a+2)<<endl;
}
}
return 0;
}