Pagini recente » Cod sursa (job #1235784) | Cod sursa (job #2110954) | Cod sursa (job #914919) | Cod sursa (job #2255299) | Cod sursa (job #1023707)
#include<stdio.h>
#include<string.h>
struct nod
{
int nrf,nrc; //nrf-fii, nrc-cuvinte
nod* v[27];
nod()
{
nrf=nrc=0;
memset(v,0,sizeof(v));
}
};
inline int max(int a,int b)
{return a>b?a:b;}
int k,sir[20],ok;
char aux[22];
nod* rad=new nod();
void insert(nod* x,int poz) // ADAUGARE
{
if(poz==k)
{
x->nrc+=1;
return;
}
if(!x->v[sir[poz]])
x->v[sir[poz]]=new nod();
insert(x->v[sir[poz]],poz+1);
}
int erase(nod* x,int poz) // STERGERE
{
if(poz==k)
{
x->nrc--;
}
else if( erase(x->v[sir[poz]],poz+1) )
{
x->v[sir[poz]]=0;
x->nrf-=1;
}
if(!x->nrf && !x->nrc && x!=rad)
{
delete x;
return 1;
}
return 0;
}
void num_ap(nod* x,int poz) // NUMAR APARITII
{
if(poz==k)
{
ok=x->nrc;
return;
}
if(!x->v[sir[poz]])
return;
num_ap(x->v[sir[poz]],poz+1);
}
void prefix_max(nod* x,int poz) // PREFIX COMUN MAXIM
{
ok=poz;
if(poz==k)
return;
if(!x->v[sir[poz]])
return;
prefix_max(x->v[sir[poz]],poz+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int op,i;
while(scanf("%d %s\n",&op,&aux)!=EOF)
{
k=strlen(aux);
for(i=0;i<k;++i)
sir[i]=aux[i]-'a';
if(op==0)
insert(rad,0);
else if(op==1)
erase(rad,0);
else if(op==2)
{
num_ap(rad,0);
printf("%d\n",ok);
}
else
{
prefix_max(rad,0);
printf("%d\n",ok);
}
memset(aux,0,sizeof(aux));
}
return 0;
}