Pagini recente » Cod sursa (job #363266) | Cod sursa (job #2266594) | Cod sursa (job #1910258) | Cod sursa (job #700900) | Cod sursa (job #1316674)
#include<cstdio>
#include<cstring>
using namespace std;
struct Trie{
int cnt;
int nrfii;
Trie *fiu[26];
Trie(){
cnt=0;
nrfii=0;
for(register int i=0;i<=26;++i)
fiu[i]=0;
}
};
Trie *T=new Trie;
void insertWord(Trie *arbtr,char *w) {
if(*w=='\0'){
arbtr->cnt++;
return;
}
if(arbtr->fiu[*w-'a']==0){
arbtr->fiu[*w-'a']=new Trie;
arbtr->nrfii++;
}
insertWord(arbtr->fiu[*w-'a'],w+1);
}
int delete_sq(Trie *arbtr,char *w) {
if(*w=='\0')
arbtr->cnt--;
else if(delete_sq(arbtr->fiu[*w-'a'],w+1)){
arbtr->fiu[*w-'a']=0;
arbtr->nrfii--;
}
if(arbtr->cnt==0 && arbtr->nrfii==0 && arbtr!=T){
delete arbtr;
return 1;
}
return 0;
}
int query(Trie *arbtr,char *w){
if(*w==NULL)
return arbtr->cnt;
if(arbtr->fiu[*w-'a'])
return query(arbtr->fiu[*w-'a'],w+1);
return 0;
}
int prefix(Trie *arbtr,char *w,int k){
if(*w==NULL || arbtr->fiu[*w-'a']==0)
return k;
return prefix(arbtr->fiu[*w-'a'],w+1,k+1);
}
int main() {
int op;
char s[32];
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(scanf("%d",&op)!=-1) {
scanf("%s",s);
switch(op){
case 0:insertWord(T,s);
break;
case 1:delete_sq(T,s);
break;
case 2:printf("%d\n",query(T,s));
break;
case 3:printf("%d\n",prefix(T,s,0));
break;
}
}
return 0;
}