Cod sursa(job #1814313)

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