Pagini recente » Cod sursa (job #505031) | Cod sursa (job #797451) | Cod sursa (job #3172297) | Cod sursa (job #1115372) | Cod sursa (job #2085872)
#include<fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
int info;
int fii;
trie *f[30];
trie(){
info=0;
fii=0;
for(int i=0;i<26;i++){
f[i]=0;
}
}
};
int ok;
char c[30];
trie *r =new trie();
void adaugare(trie *x,char *c){
if(*c==0){
x->info++;
return;
}
if(x->f[*c-'a'+1]==0){
x->f[*c-'a'+1]=new trie;
x->fii++;
}
adaugare(x->f[*c-'a'+1],c+1);
}
int stergere(trie *&nod,char *c){
if(*c==0){
nod->info--;
if(nod->fii==0 && nod->info==0 && r!=nod){
delete nod;
nod=0;
return 1;
}
return 0;
}
if(stergere(nod->f[*c-'a'+1],c+1)!=0){
nod->fii--;
if (nod->fii == 0 && nod->info == 0 && nod != r){
delete nod;
nod = 0;
return 1;
}
}
return 0;
}
int numarare(trie *nod,char *c){
if(*c==0){
return nod->info;
}
if(nod->f[*c-'a'+1]==0){
return 0;
}
return numarare(nod->f[*c-'a'+1],c+1);
}
int prefix(trie *nod, char *c){
if(*c==0){
return 0;
}
if(nod->f[*c-'a'+1]==0){
return 0;
}
return 1+prefix(nod->f[*c-'a'+1],c+1);
}
int main(){
while(fin>>ok){
fin>>c;
if(ok==0){
adaugare(r,c);
}
if(ok==1){
stergere(r,c);
}
if(ok==2){
fout<<numarare(r,c)<<"\n";
}
if(ok==3){
fout<<prefix(r,c)<<"\n";
}
}
return 0;
}