Cod sursa(job #2248026)

Utilizator lupulescu2001Lupulescu Vlad lupulescu2001 Data 29 septembrie 2018 11:02:55
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<fstream>
#include<cstring>
#include<string>

#define D (*S-'a')

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Trie {
    int Cont,Fii;
    Trie *Fiu[30];

    Trie(){
        Cont=0;
        Fii=0;
        memset(Fiu,0,sizeof(Fiu));
    }
};

Trie *T=new Trie;

void Add(Trie *Nod, char *S){
    if(*S=='\0'){
        Nod->Cont++;
        return;
    }
    if(Nod->Fiu[D] == 0){
        Nod->Fiu[D]= new Trie;
        Nod->Fii++;
    }
    Add(Nod->Fiu[D],S+1);
}

int Del(Trie *Nod,char *S){
    if(*S=='\0'){
        Nod->Cont--;
    }
    else if(Del(Nod->Fiu[D],S+1)){
            Nod->Fiu[D]=0;
            Nod->Fii--;
    }
    if(Nod->Cont==0 && Nod->Fii==0 && Nod!=T){
        delete Nod;
        return 1;
    }
    return 0;
}

int Query(Trie *Nod,char *S){
    if(*S=='\0')
        return Nod->Cont;
    if(Nod->Fiu[D])
        return Query(Nod->Fiu[D],S+1);
    return 0;
}

int Prefix(Trie *Nod,char *S,int K){
    if(*S=='\0' || Nod->Fiu[D] == 0)
        return K;
    return Prefix(Nod->Fiu[D],S+1,K+1);
}

int main(){
    int Com;
    char Cuv[30];
    while(fin>>Com>>Cuv){
        if(Com==0)
           Add(T,Cuv);
        if(Com==1)
           Del(T,Cuv);
        if(Com==2)
            fout<<Query(T,Cuv)<<'\n';
        if(Com==3)
            fout<<Prefix(T,Cuv,0)<<'\n';
    }
    return 0;
}