Pagini recente » infoarena - te ajutam sa devii olimpic! | Cod sursa (job #2819494) | Cod sursa (job #1541905) | Cod sursa (job #32942) | Cod sursa (job #690310)
Cod sursa(job #690310)
#include<stdio.h>
#include<string.h>
struct nod{long nr,nf;char c;nod* f[26];nod* t;};
nod* n;
nod* r;
nod* aux;
nod* nn;
long l,i,ll,m,x;
char s[100];
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
r=new nod;
r->nr=r->nf=r->c=0;
memset(r->f,NULL,sizeof(r->f));
r->t=NULL;
while(gets(s))
{
l=strlen(s);
if(s[0]=='0')
{
n=r;
for(i=2;i<l;++i)
if(n->f[s[i]-'a']!=NULL)n=n->f[s[i]-'a'];
else
{
n->nf++;
aux=new nod;
memset(aux->f,NULL,sizeof(aux->f));
aux->nf=aux->nr=0;
aux->c=s[i];
n->f[s[i]-'a']=aux;
aux->t=n;
n=aux;}
n->nr++;
}
else
if(s[0]=='1')
{
n=r;
for(i=2;i<l;++i)
n=n->f[s[i]-'a'];
n->nr--;
if(n->nr==0)
{
do
{
aux=n;
n=n->t;
n->f[aux->c-'a']=NULL;
delete aux;
}while(n->nf<=1&&n->nr==0);
n->nf--;
}
}
else
if(s[0]=='2')
{
n=r;
for(i=2;i<l&&n!=NULL;++i)
n=n->f[s[i]-'a'];
if(n==NULL)printf("0\n");
else printf("%ld\n",n->nr);
}
else
{
n=r;
for(i=2;i<l&&n!=NULL;++i)
{nn=n;n=n->f[s[i]-'a'];}
l=i-2;x=0;
if(n==NULL)n=nn,x=1;
l-=x;
while(n!=r)
{
if(n->nf>1-x||n->nr!=0)break;
n=n->t;--l;
}
printf("%ld\n",l);
}
}
return 0;
}