Cod sursa(job #778729)
#include <cstdio>
#include <cstring>
using namespace std;
#define dim 100005
char sir[dim];
struct trie {
int cnt, nr_fii;
trie *fiu[26];
trie(){
cnt=nr_fii=0;
memset(fiu,0,sizeof(fiu));
}
};
trie *T=new trie;
void insert(trie *nod, char *p){
if(*p=='\n') { nod->cnt++; return ;}
if( nod->fiu[*p-'a']==0){
nod->fiu[*p-'a']=new trie;
nod->nr_fii++;
}
insert(nod->fiu[*p-'a'],p+1);
}
int sterge(trie *nod, char *p){
if(*p=='\n') nod->cnt--;
else if(sterge(nod->fiu[*p-'a'],p+1)){
nod->fiu[*p-'a']=0;
nod->nr_fii--;
}
if(nod->cnt==0 && nod->nr_fii==0 && nod!=T){
delete nod; return 1;
}
return 0;
}
int aparitii(trie *nod, char *p){
if(*p=='\n')return nod->cnt;
if(nod->fiu[*p-'a']!=0)
return aparitii(nod->fiu[*p-'a'],p+1);
return 0;
}
int prefix(trie *nod, char *p,int k){
if(*p=='\n' || nod->fiu[*p-'a']==0) return k;
return prefix(nod->fiu[*p-'a'],p+1,k+1);
}
int main(void){
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(fgets(sir,dim,stdin)){
if(sir[0]=='0')insert(T,sir+2);
if(sir[0]=='1')sterge(T,sir+2);
if(sir[0]=='2')printf("%d\n", aparitii(T,sir+2));
if(sir[0]=='3')printf("%d\n", prefix(T,sir+2,0));
}
return 0;
}