Pagini recente » Cod sursa (job #478851) | Cod sursa (job #3128244) | Cod sursa (job #243315) | Cod sursa (job #2258152) | Cod sursa (job #1369392)
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
struct Nod{
int na, ns;
Nod *fii[27];
Nod()
{
na=ns=0;
memset(fii, 0, sizeof(fii));
}
};
Nod *R=new Nod;
int o;
char t[25];
void Add(char *u, Nod *x)
{
if (*u==0)
{
++x->na;
return;
}
if (x->fii[*u-'a']==0)
{
x->fii[*u-'a']=new Nod;
++x->ns;
}
Add(u+1, x->fii[*u-'a']);
}
bool Erase(char *u, Nod *x)
{
if (*u==0)
--x->na;
else if (Erase(u+1, x->fii[*u-'a'])==1)
{
--x->ns;
x->fii[*u-'a']=0;
}
if (x!=R && x->ns==0 && x->na==0)
{
delete x;
return 1;
}
return 0;
}
int Nr(char *u, Nod *x)
{
if (*u==0)
return x->na;
if (x->fii[*u-'a'])
return Nr(u+1, x->fii[*u-'a']);
return 0;
}
int Prefix(char *u, Nod *x, int k)
{
if (*u==0)
return k;
if (x->fii[*u-'a'])
return Prefix(u+1, x->fii[*u-'a'], k+1);
return k;
}
int main()
{
while(cin>>o>>t)
{
if (o==0)
Add(t, R);
if (o==1)
Erase(t, R);
if (o==2)
cout<<Nr(t, R)<<'\n';
if (o==3)
cout<<Prefix(t, R, 0)<<'\n';
}
return 0;
}