Pagini recente » Cod sursa (job #655226) | Cod sursa (job #1239251) | Cod sursa (job #1457924) | Cod sursa (job #590113) | Cod sursa (job #1814290)
# include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
int cnt;
int fii;
trie *next[26];
trie(){
cnt=fii=0;
for(int i=0;i<26;i++)
next[i]=0;
}
};
trie *rad;
char s[25];
int op,nr;
void add(trie *nod,char *s){
if(*s==0)
nod->cnt++;
else{
if(nod->next[*s-'a']==NULL){
nod->fii++;
nod->next[*s-'a']=new trie;
}
add(nod->next[*s-'a'],s+1);
}
}
int delet(trie *&nod,char *s){
if(*s==0){
nod->cnt--;
if(nod->fii==0&&nod->cnt==0&&nod!=rad){
delete nod;
nod=0;
return 1;
}
return 0;
}
if(delet(nod->next[*s-'a'],s+1))
nod->fii--;
if(nod->fii==0&&nod->cnt==0&&nod!=rad){
delete nod;
nod=0;
return 1;
}
return 0;
}
int det_numb(trie *nod,char *s){
if(*s==0)
return nod->cnt;
if(nod->next[*s-'a']==NULL)
return 0;
return det_numb(nod->next[*s-'a'],s+1);
}
int prefix(trie *nod,char *s){
nr++;
if(*s==0)
return nr-1;
if(nod->next[*s-'a']==NULL)
return nr-1;
return prefix(nod->next[*s-'a'],s+1);
}
int main () {
rad=new trie;
while(fin>>op>>s){
if(op==0)
add(rad,s);
if(op==1)
delet(rad,s);
if(op==2)
fout<<det_numb(rad,s)<<"\n";
if(op==3){
nr=0;
fout<<prefix(rad,s)<<"\n";
}
}
return 0;
}