Pagini recente » Cod sursa (job #839377) | Cod sursa (job #2660767) | Cod sursa (job #2755487) | Cod sursa (job #1097468) | Cod sursa (job #1644030)
#include <bits/stdc++.h>
using namespace std;
int op;
struct trie
{
int nrcuv,nrfii;
trie *fii[26];
trie()
{
nrcuv=0;
nrfii=0;
memset(fii,0,sizeof(trie));
}
};
trie *root=new trie;
void adaug(char *p,trie *nod)
{
if (*p=='\n')
{
nod->nrcuv++;
return;
}
if (!nod->fii[*p-'a'])
nod->fii[*p-'a']=new trie;
nod->nrfii++;
adaug(p+1,nod->fii[*p-'a']);
}
int sterge(char *p,trie *nod)
{
if (*p=='\n')
nod->nrcuv--;
else if (sterge(p+1,nod->fii[*p-'a']))
{
nod->fii[*p-'a']=0;
nod->nrfii--;
}
if (nod->nrcuv==0 && nod->nrfii==0 && nod!=root)
{
delete nod;
return 1;
}
return 0;
}
int numara(char *p,trie *nod)
{
if (*p=='\n')
return nod->nrcuv;
if (!nod->fii[*p-'a'])
return 0;
numara(p+1,nod->fii[*p-'a']);
}
int prefix(char *p,trie *nod,int k)
{
if (*p=='\n')
return k;
if (!nod->fii[*p-'a'])
return k;
prefix(p+1,nod->fii[*p-'a'],k+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
char s[32];
while (!feof(stdin))
{
scanf("%d ",&op);
fgets(s,32,stdin);
scanf("\n");
if (op==0)
adaug(s,root);
else if (op==1)
sterge(s,root);
else if (op==2)
printf("%d\n",numara(s,root));
else
printf("%d\n",prefix(s,root,0));
}
return 0;
}