Pagini recente » Cod sursa (job #2958433) | Cod sursa (job #161339) | Monitorul de evaluare | Cod sursa (job #1595880) | Cod sursa (job #1554995)
#include <cstdio>
#include<string.h>
using namespace std;
char sir[30];
struct nod{
int ap, nrf;
nod *fii[26];
nod(){
ap=nrf=0;
memset(fii, 0, sizeof(fii));
}
};
nod *radacina;
void adauga(nod *aux, char *s)
{
if(*s==0)
{
aux->ap++;
return;
}
if(aux->fii[*s-'a']==0)
{
aux->fii[*s-'a']=new nod;
aux->nrf++;
}
adauga(aux->fii[*s-'a'], s+1);
}
int sterge(nod *aux, char *s)
{
if(*s==0)
aux->ap--;
else
{
if(sterge(aux->fii[*s-'a'], s+1))
{
aux->fii[*s-'a']=0;
aux->nrf--;
}
}
if(aux->nrf==0&&aux->ap==0&&aux!=radacina)
{
delete aux;
return 1;
}
return 0;
}
int parcurgere(nod *aux, char *s)
{
if(*s==0)
return aux->ap;
if(aux->fii[*s-'a'])
return parcurgere(aux->fii[*s-'a'], s+1);
return 0;
}
int prefix(nod *aux, char *s, int pr)
{
if(*s==0 || aux->fii[*s-'a']==0)
return pr;
return prefix(aux->fii[*s-'a'], s+1, pr+1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int q, n;
gets(sir);
radacina=new nod;
while(!feof(stdin))
{
q=sir[0]-'0';
strcpy(sir, sir+2);
if(q==0)
adauga(radacina, sir);
if(q==1)
sterge(radacina, sir);
if(q==2)
printf("%d\n", parcurgere(radacina, sir));
if(q==3)
printf("%d\n", prefix(radacina, sir, 0));
gets(sir);
}
return 0;
}