Cod sursa(job #1815846)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 25 noiembrie 2016 20:33:44
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
# include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
    int cnt;
    int fii;
    trie *next[26];
    trie(){
        cnt=fii=0;
        for(int i=1;i<26;i++)
            next[i]=0;
    }
};
trie *sursa;
int r,op,nr;
char s[25];
void adauga(trie *nod,char *s){
    if(*s==0)
        nod->cnt++;
    else{
        if(nod->next[*s-'a']==NULL){
            nod->next[*s-'a']=new trie;
            nod->fii++;
        }
        adauga(nod->next[*s-'a'],s+1);
    }
}
int sterge(trie *&nod,char *s){
    if(*s==0){
        nod->cnt--;
        if(nod->cnt==0&&nod->fii==0&&nod!=sursa){
            delete nod;
            nod=0;
            return 1;
        }
        return 0;
    }
    if(sterge(nod->next[*s-'a'],s+1)){
        nod->fii--;
        if(nod->cnt==0&&nod->fii==0&&nod!=sursa){
            delete nod;
            nod=0;
            return 1;
        }
    }
    return 0;
}
int nraparitii(trie *nod,char *s){
    if(*s==0)
        return nod->cnt;
    if(nod->next[*s-'a']==NULL)
        return 0;
    return nraparitii(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 () {
    sursa=new trie;
    while(fin>>op>>s){
        if(op==0)
            adauga(sursa,s);
        if(op==1)
            sterge(sursa,s);
        if(op==2)
            fout<<nraparitii(sursa,s)<<"\n";
        if(op==3){
            nr=0;
            fout<<prefix(sursa,s)<<"\n";
        }
    }
    return 0;
}