Pagini recente » Cod sursa (job #2711545) | Cod sursa (job #3256114) | Cod sursa (job #1937660) | Cod sursa (job #1744684) | Cod sursa (job #1023730)
#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,ok;
char sir[22];
nod* rad=new nod();
void insert(nod* x,int poz) // ADAUGARE
{
if(poz==k)
{
x->nrc+=1;
return;
}
if(!x->v[sir[poz]-'a'])
{
x->nrf+=1;
x->v[sir[poz]-'a']=new nod();
}
insert(x->v[sir[poz]-'a'],poz+1);
}
int erase(nod* x,int poz) // STERGERE
{
if(poz==k)
{
x->nrc--;
}
else if( erase(x->v[sir[poz]-'a'],poz+1) )
{
x->v[sir[poz]-'a']=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]-'a'])
return;
num_ap(x->v[sir[poz]-'a'],poz+1);
}
void prefix_max(nod* x,int poz) // PREFIX COMUN MAXIM
{
ok=poz;
if(poz==k)
return;
if(!x->v[sir[poz]-'a'])
return;
prefix_max(x->v[sir[poz]-'a'],poz+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int op,i;
while(scanf("%d %s\n",&op,&sir)!=EOF)
{
k=strlen(sir);
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(sir,0,sizeof(sir));
}
return 0;
}