Pagini recente » Cod sursa (job #1522762) | Cod sursa (job #983447) | Cod sursa (job #1196509) | Cod sursa (job #1455037) | Cod sursa (job #1023688)
#include<stdio.h>
#include<string.h>
struct nod
{
int nrf;
nod* v[27];
nod()
{
nrf=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();
inline bool comun(nod* x)
{
for(int i=0;i<26;++i)
if(x->v[i])
return 1;
return 0;
}
void insert(nod* x,int poz) // ADAUGARE
{
if(poz==k)
{
x->nrf+=1;
return;
}
if(!x->v[sir[poz]])
x->v[sir[poz]]=new nod();
insert(x->v[sir[poz]],poz+1);
}
void erase(nod* x,int poz) // STERGERE
{
if(poz==k)
{
x->nrf-=1;
return;
}
if(!x->v[sir[poz]])
return;
erase(x->v[sir[poz]],poz+1);
}
void num_ap(nod* x,int poz) // NUMAR APARITII
{
if(poz==k)
{
ok=x->nrf;
if(!x->nrf && !comun)
delete x;
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;
}