Cod sursa(job #720103)
#include<iostream>
using namespace std;
struct trie{
int prefixe, cuvinte;
trie *link[26];
trie()
{for(int i=26; i--;)
link[i]=0;
cuvinte=prefixe=0;
}
};
void inserare(trie *x, char *cuv)
{for(int i=0, t=cuv[i]-97, n=strlen(cuv); i<n; i++, t=cuv[i]-97, x->prefixe++)
if(x->link[t]!=NULL)
x=x->link[t];
else x=x->link[t]=new trie();
x->cuvinte++;
}
void stergere(trie *x, char *cuv)//se garanteaza cuv in trie
{for(int i=0, t=cuv[i]-97, n=strlen(cuv); i<n; i++, t=cuv[i]-97, x->prefixe--)
if(x->link[t]!=NULL)
x=x->link[t];
x->cuvinte--;
}
int nr_aparitii(trie *x, char *cuv)
{for(int i=0, t=cuv[i]-97, n=strlen(cuv); i<n; i++, t=cuv[i]-97)
if(x->link[t]!=NULL)
x=x->link[t];
else return 0;
return x->cuvinte;
}
int prefix_comun(trie *x, char *cuv)
{int i=0;
for(int t=cuv[0]-97, n=strlen(cuv); i<n && x->link[t]!=NULL && x->link[t]->prefixe!=0; i++, t=cuv[i]-97)
if(x->link[t]!=NULL)
x=x->link[t];
return i;
}
int main()
{freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
trie x;
int choice;
char string[26];
for(; cin>>choice>>string;)
{switch(choice){ case 0: {inserare(&x, string);;
break;
}
case 1: {stergere(&x, string);
break;
}
case 2: {cout<<nr_aparitii(&x, string)<<"\n";
break;
}
case 3: {cout<<prefix_comun(&x, string)<<"\n";
break;
}
}
}
return 0;
}