Pagini recente » Cod sursa (job #332957) | Cod sursa (job #326618) | Cod sursa (job #633609) | Cod sursa (job #634406) | Cod sursa (job #1581654)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct trie{
int nrcuv,nrfii;
trie *fiu[26];
trie()
{
nrcuv=0;
nrfii=0;
memset(fiu,0,sizeof(fiu));
}
};
trie *t=new trie;
void ins(trie *nod, char *s)
{
if (*s=='\n')
{
nod->nrcuv++;
return;
}
if (nod->fiu[*s-'a']==0)
{
nod->fiu[*s-'a']=new trie;
nod->nrfii++;
}
ins(nod->fiu[*s-'a'],s+1);
}
int del(trie *nod , char *s)
{
if (*s=='\n')
nod->nrcuv--;
else if (del(nod->fiu[*s-'a'],s+1))
{
nod->fiu[*s-'a']=0;
nod->nrfii--;
}
if (nod->nrcuv==0 && nod->nrfii==0 && nod !=t)
{
delete nod;
return 1;
}
return 0;
}
int num(trie *nod,char *s)
{
if (*s=='\n')
return nod->nrcuv;
if (nod->fiu[*s-'a'])
num(nod->fiu[*s-'a'],s+1);
else
return 0;
}
int que(trie *nod,char *s,int k)
{
if (nod->fiu[*s-'a']==0 || *s=='\n')
return k;
que(nod->fiu[*s-'a'],s+1,k+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
char l[32];
fgets(l,32 ,stdin);
while (!feof(stdin) )
{
if (l[0]=='0')
ins(t,l+2);
if (l[0]=='1')
del(t,l+2);
if (l[0]=='2')
printf("%d\n",num(t,l+2));
if (l[0]=='3')
printf("%d\n",que(t,l+2,0));
fgets(l,32 ,stdin);
}
return 0;
}