Cod sursa(job #1802984)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 10 noiembrie 2016 21:13:07
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
# include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
    int fii;
    int inf;
    trie *next[26];
    trie (){
        fii=0;
        inf=0;
        for(int i=0;i<26;i++)
            next[i]=0;
    }
};
char s[20];
int op;
trie *ns;
void insert(trie *p,char *s){
    if(*s==0){
        p->inf++;
        return;
    }
    if(p->next[*s-'a']==0){
        p->next[*s-'a']=new trie;
        p->fii++;
    }
    insert(p->next[*s-'a'],s+1);
}
int sterge(trie *&p,char *s){
    if(*s==0){
        p->inf--;
        if(p->inf==0&&p->fii==0&&p!=ns){
            delete p;
            p=0;
            return 1;
        }
        return 0;
    }
    if(sterge(p->next[*s-'a'],s+1)){
        p->fii--;
        if(p->inf==0&&p->fii==0&&p!=ns){
            delete p;
            p=0;
            return 1;
        }
        return 0;
    }
}
int aparitii(trie *p,char *s){
    if(*s==0)
        return p->inf;
    if(p->next[*s-'a']!=0)
        return aparitii(p->next[*s-'a'],s+1);
    else
        return 0;
}
int prefix(trie *p,char *s,int nr){
    if(*s==0)
        return nr;
    if(p->next[*s-'a']==0)
        return nr;
    else
        return prefix(p->next[*s-'a'],s+1,nr+1);
}
int main () {
    ns=new trie;
    while(fin>>op>>s){
        if(op==0)
            insert(ns,s);
        if(op==1)
            sterge(ns,s);
        if(op==2)
            fout<<aparitii(ns,s)<<"\n";
        if(op==3)
            fout<<prefix(ns,s,0)<<"\n";
    }
    return 0;
}