Cod sursa(job #2325871)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 23 ianuarie 2019 00:05:33
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
# include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
    int fii,aparitii;
    trie *nx[26];
    trie(){
        fii=aparitii=0;
        for(int i=0;i<26;i++)
            nx[i]=NULL;
    }
} *tata;
char cuv[25];
int op;
void adauga(trie *nod,char *s){
    if(*s==NULL){
        nod->aparitii++;
        return;
    }
    if(nod->nx[*s-'a']==NULL){
        nod->nx[*s-'a']=new trie;
        nod->fii++;
    }
    adauga(nod->nx[*s-'a'],s+1);
}
void sterge(trie *nod,char *s){
    if(*s==NULL){
        nod->aparitii--;
        return;
    }
    sterge(nod->nx[*s-'a'],s+1);
    if(nod->nx[*s-'a']->fii==0&&nod->nx[*s-'a']->aparitii==0){
        delete nod->nx[*s-'a'];
        nod->nx[*s-'a']=NULL;
        nod->fii--;
    }
}
int numar(trie *nod,char *s){
    if(*s==NULL)
        return nod->aparitii;
    if(nod->nx[*s-'a']==NULL)
        return 0;
    return numar(nod->nx[*s-'a'],s+1);
}
int prefix(trie *nod, char *s){
    if(*s==NULL)
        return 0;
    if(nod->nx[*s-'a']==NULL)
        return 0;
    return prefix(nod->nx[*s-'a'],s+1)+1;
}
int main () {
    tata=new trie;
    while(fin>>op>>cuv){
        if(op==0){
            adauga(tata,cuv);
            continue;
        }
        if(op==1){
            sterge(tata,cuv);
            continue;
        }
        if(op==2){
            fout<<numar(tata,cuv)<<"\n";
            continue;
        }
        fout<<prefix(tata,cuv)<<"\n";
    }
    return 0;
}