Pagini recente » Cod sursa (job #2536949) | Cod sursa (job #817675) | Cod sursa (job #1353411) | Cod sursa (job #220094) | Cod sursa (job #1512467)
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct Trie{
int cnt,nrfii;
Trie *fiu[26];
Trie(){
cnt=nrfii=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T=new Trie;
char s[30];
void ins(Trie *nod,char *s){
if(*s==0){
nod->cnt++;
return;
}
if(nod->fiu[*s-'a']==0){
nod->fiu[*s-'a']=new Trie;
nod->nrfii++;
}
ins(nod->fiu[*s-'a'],s+1);
}
int del(Trie *nod,char *s){
if(*s==0)
nod->cnt--;
else
if(del(nod->fiu[*s-'a'],s+1)==1){
nod->fiu[*s-'a']=0;
nod->nrfii--;
}
if(nod->cnt==0&&nod->nrfii==0&&nod!=T){
delete nod;
return 1;
}
return 0;
}
int query(Trie *nod,char *s){
if(*s==0)
return nod->cnt;
if(nod->fiu[*s-'a']!=0)
return query(nod->fiu[*s-'a'],s+1);
return 0;
}
int prefix(Trie *nod,char *s,int k){
if(*s==0||nod->fiu[*s-'a']==0)
return k;
return prefix(nod->fiu[*s-'a'],s+1,k+1);
}
int main(){
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int n,op;
while(gets(s)!=NULL){
op=s[0]-'0';
if(op==0)
ins(T,s+2);
if(op==1)
del(T,s+2);
if(op==2)
printf("%d\n",query(T,s+2));
if(op==3)
printf("%d\n",prefix(T,s+2,0));
}
return 0;
}