Pagini recente » Cod sursa (job #2066813) | Cod sursa (job #1647925) | Cod sursa (job #1110086) | Cod sursa (job #890975) | Cod sursa (job #1814313)
# include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
int fii;
int cnt;
trie *next[26];
trie(){
fii=cnt=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 del(trie *&nod,char *s){
if(*s==0){
nod->cnt--;
if(nod->cnt==0&&nod->fii==0&&nod!=rad){
delete nod;
nod=NULL;
return 1;
}
return 0;
}
if(del(nod->next[*s-'a'],s+1))
nod->fii--;
if(nod->cnt==0&&nod->fii==0&&nod!=rad){
delete nod;
nod=NULL;
return 1;
}
return 0;
}
int det_num(trie *nod,char *s){
if(*s==0)
return nod->cnt;
if(nod->next[*s-'a']==NULL)
return 0;
return det_num(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)
del(rad,s);
if(op==2)
fout<<det_num(rad,s)<<"\n";
if(op==3){
nr=0;
fout<<prefix(rad,s)<<"\n";
}
}
return 0;
}