Pagini recente » Cod sursa (job #578822) | Cod sursa (job #581532) | Cod sursa (job #480209) | Cod sursa (job #2588113) | Cod sursa (job #2266685)
#include <cstdio>
#include <cstring>
#define MAXLIT 21
FILE*fi,*fout;
char str[MAXLIT];
struct Trie{
int con,nrfii;
Trie *fii[26];
Trie(){
con=nrfii=0;
memset(fii,0,sizeof(fii));
}
};
Trie *T = new Trie;
void insert(Trie *nod,char *s){
if((*s)>=0&&(*s)<26){
if(nod->fii[*s]==0){
nod->nrfii++;
nod->fii[*s]=new Trie;
}
insert(nod->fii[*s],s+1);
}
else
nod->con++;
}
int flag;
void del(Trie *nod,char *s){
if((*s)>=0&&(*s)<26){
del(nod->fii[*s],s+1);
if(flag==1)
nod->nrfii--;
if(nod->nrfii==0&&flag==1&&nod!=T&&nod->con==0)
delete nod;
else{
if(flag==1)
nod->fii[*s]=0;
flag=0;
}
}
else{
nod->con--;
if(nod->nrfii==0&&nod->con==0&&nod!=T){
flag=1;
delete nod;
}
}
}
int print_word(Trie *nod,char *s,int niv){
if((*s)>=0&&(*s)<26){
if(nod->fii[*s]==0)
return 0;
return print_word(nod->fii[*s],s+1,niv+1);
}
else
return nod->con;
}
int print_prefix(Trie *nod,char *s,int niv){
if((*s)==-1||nod->fii[*s]==0)
return niv;
else
return print_prefix(nod->fii[*s],s+1,niv+1);
}
int main(){
int n;
char a,t;
fi=fopen("trie.in" ,"r");
fout=fopen("trie.out" ,"w");
a=fgetc(fi);
while(a!=EOF){
t=a;
a=fgetc(fi);
a=fgetc(fi);
n=0;
while(a>='a'&&a<='z'){
str[n++]=a-'a';
a=fgetc(fi);
}
a=fgetc(fi);
t-='0';
str[n]=-1;
if(t==0)
insert(T,str);
if(t==1){
flag=0;
del(T,str);
}
if(t==2)
fprintf(fout,"%d\n" ,print_word(T,str,0));
if(t==3)
fprintf(fout,"%d\n" ,print_prefix(T,str,0));
}
fclose(fi);
fclose(fout);
return 0;
}