Pagini recente » Cod sursa (job #1173168) | Cod sursa (job #2230730) | Cod sursa (job #1250044) | Cod sursa (job #1937657) | Cod sursa (job #432900)
Cod sursa(job #432900)
#include<algorithm>
#include<iostream>
using namespace std;
#define SIGMA 26
struct trie
{
int nod,nrfii;
trie *next[SIGMA];
trie()
{
nod=nrfii=0;
memset(next,0,sizeof( next ) );
}
};
trie *T = new trie;
char sir[5000];
int N,a;
int adauga(trie *anod,char *s)
{
if(*s=='\n')
{
anod->nod ++;
return 0;
}
if(anod->next[*s-'a'] == 0)
{
anod->next[*s-'a']=new trie;
anod->nrfii++;
}
adauga(anod->next[ *s-'a' ],s+1);
return -1;
}
int sterge(trie *anod,char *s)
{
//printf("%c",*s);
if(*s=='\n')
anod->nod--;
else if( sterge( anod->next[ *s-'a' ],s+1))
{//printf("!");
anod->next[ *s-'a' ] = 0;
anod->nrfii--;
}
if(anod->nod == 0&&anod->nrfii==0&& anod!= T )
{//printf("!");
delete anod;
return 1;
}
return 0;
}
int afis(trie *anod, char *s)
{
if(*s=='\n')
return anod->nod;
if(anod -> next [*s - 'a'])
return afis(anod->next[*s-'a'],s+1);
return 0;
}
int ver(trie *anod,char *s,int k)
{
if(*s=='\n' || !anod->next[*s-'a'])
return k;
return ver(anod->next[*s-'a'],s+1,k+1);
return 0;
}
int x=0;
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(scanf("%d ",&a)==1)
{
x=0;
// printf("%d", a);
fgets(sir,32,stdin);
if(a==0)
x=adauga(T,sir);
if(a==1)
x=sterge(T,sir);
if(a==2)
{
x=afis(T,sir);
printf("%d\n",x);
}
if(a==3)
{
printf("%d\n",ver(T,sir,0));
}
// cout<<sir;
}
}