Pagini recente » Cod sursa (job #3124313) | Cod sursa (job #284891) | Cod sursa (job #1335192) | Cod sursa (job #2075064)
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 20
using namespace std;
struct nod
{
int val, nrfii=0;
nod *fii[26];
nod();
};
nod *root= new nod();
nod::nod()
{
for(int i=0; i<27; i++)
fii[i]=NULL;
val=0;
}
char a[100000], leg, k, nr;
void Add(nod *&r, int c)
{
if(a[c]==0)
{
r->val++;
return;
}
if(!(r->fii[a[c]-'a']))
{
r->fii[a[c]-'a']= new nod();
r->nrfii++;
}
Add(r->fii[a[c]-'a'], c+1);
}
int Del(nod *r, int c)
{
if(a[c] == '\0')
r->val--;
else if(Del(r->fii[a[c]-'a'], c+1))
{
r->fii[a[c]-'a']=0;
r->nrfii--;
}
if(r->val == 0 && r->nrfii==0 && r!=root)
{
delete r;
return 1;
}
return 0;
}
int Count(nod *r, int c)
{
if(a[c] == '\0')
return r->val;
if(r->fii[a[c]-'a'] == NULL)
return 0;
return Count(r->fii[a[c]-'a'], c+1);
}
int Prefix(nod *r, int c)
{
if(r->fii[a[c]-'a'] == NULL)
return nr;
else nr++;
return Prefix(r->fii[a[c]-'a'], c+1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int op;
scanf("%d ", &op);
cin.getline(a, N);
while(!cin.eof())
{
leg=strlen(a);
if(op==0)
Add(root, 0);
else if(op==1)
Del(root, 0);
else if(op==2)
cout<<Count(root, 0)<<endl;
else if(op==3)
{
cout<<Prefix(root, 0)<<endl;
nr=0;
}
a[0]=NULL;
scanf("%d ", &op);
cin.getline(a, N);
}
return 0;
}