Pagini recente » Cod sursa (job #2914984) | Cod sursa (job #1275541) | Cod sursa (job #105525) | Cod sursa (job #2233713) | Cod sursa (job #1320345)
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
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[1101010];
int N,a;
int adauga(trie *anod,char *s)
{
int k =0;
while(true){
if(*s=='\n')
{
anod->nod ++;
return 0;
}
if(anod->next[*s-'a'] == 0)
{
anod->next[*s-'a']=new trie;
anod->nrfii++;
}
anod = anod->next[ *s-'a' ];
s = s+1;
}
}
int sterge(trie *anod,char *s)
{
if(*s=='\n')
anod->nod--;
else if( sterge( anod->next[ *s-'a' ],s+1))
{
anod->next[ *s-'a' ] = 0;
anod->nrfii--;
}
if(anod->nod == 0&&anod->nrfii==0&& anod!= T )
{
delete anod;
return 1;
}
return 0;
}
int afis(trie *anod, char *s)
{
while(true){
if(*s=='\n')
return anod->nod;
if(anod -> next [*s - 'a']) {
anod = anod->next[*s-'a'];
s=s+1;
}
else return 0;
}
}
int ver(trie *anod,char *s,int k)
{
while(true){
if(*s=='\n' || !anod->next[*s-'a'])
return k;
anod=anod->next[*s-'a'];
s=s+1;
k=k+1;
}
}
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,1100000,stdin);
//cout<<"!";
if(a==0)
x=adauga(T,sir);
//cout<<"!";
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;
}
}