Cod sursa(job #2085871)

Utilizator Liviu_Ionut_MoantaMoanta Ionut Liviu Liviu_Ionut_Moanta Data 10 decembrie 2017 20:50:02
Problema Trie Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
    int info;
    int fii;
    trie *f[26];
    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;
}