Pagini recente » Cod sursa (job #2451117) | Cod sursa (job #1890860) | Cod sursa (job #687693) | Cod sursa (job #2359381) | Cod sursa (job #2075151)
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 22
using namespace std;
struct nod
{
int val, nrfii;
nod *fii[26];
nod();
};
nod *root= new nod();
nod::nod()
{
for(int i=0; i<27; i++)
fii[i]=NULL;
val=nrfii=0;
}
char a[N], leg, k;
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, int depth=0)
{
if(r->fii[a[c]-'a'] == NULL)
return depth;
return Prefix(r->fii[a[c]-'a'], c+1, depth+1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int op;
while(!feof(stdin))
{
scanf("%d %s\n", &op, a);
leg=strlen(a);
switch(op)
{
case 0:
Add(root,0);
break;
case 1:
Del(root,0);
break;
case 2:
printf("%d\n", Count(root,0));
break;
case 3:
printf("%d\n", Prefix(root,0));
break;
}
}
return 0;
}