Cod sursa(job #2079627)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 1 decembrie 2017 17:14:29
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
# include <fstream>
# include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod{
    int nr,vecini;
    nod *next[26];
} *tata;
char cuv[25];
int n,op;
void initializare(nod *&a){
    a=new nod;
    for(int i=0;i<26;i++)
        a->next[i]=NULL;
    a->nr=a->vecini=0;
}
void adauga(nod *&nc,int poz){
    if(nc==NULL)
        initializare(nc);
    if(poz==n+1){
        nc->nr++;
        return;
    }
    if(nc->next[cuv[poz]-'a']==NULL)
        nc->vecini++;
    adauga(nc->next[cuv[poz]-'a'],poz+1);
}
void sterge(nod *&nc,int poz){
    if(poz==n+1)
        nc->nr--;
    else{
        if(nc->next[cuv[poz]-'a']!=NULL){
            sterge(nc->next[cuv[poz]-'a'],poz+1);
            if(nc->next[cuv[poz]-'a']==NULL)
                nc->vecini--;
        }
    }
    if(nc->nr==0&&nc->vecini==0){
        delete nc;
        nc=NULL;
    }
}
int aparitii(nod *&nc,int poz){
    if(poz==n+1)
        return nc->nr;
    if(nc->next[cuv[poz]-'a']==NULL)
        return 0;
    else
        return aparitii(nc->next[cuv[poz]-'a'],poz+1);
}
int prefix(nod *&nc,int poz){
    if(poz==n+1)
        return 0;
    if(nc->next[cuv[poz]-'a']==NULL)
        return 0;
    else
        return 1+prefix(nc->next[cuv[poz]-'a'],poz+1);
}
int main () {
    initializare(tata);
    while(fin>>op>>cuv+1){
        n=strlen(cuv+1);
        if(op==0){
            adauga(tata,1);
            continue;
        }
        if(op==1){
            sterge(tata,1);
            continue;
        }
        if(op==2){
            fout<<aparitii(tata,1)<<"\n";
            continue;
        }
        fout<<prefix(tata,1)<<"\n";
    }
    return 0;
}