Cod sursa(job #2521433)

Utilizator Bogdan_BuzatuBuzatu Bogdan Mihai Bogdan_Buzatu Data 10 ianuarie 2020 20:47:52
Problema Trie Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include<fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");

int cerinta;
char cuvant[30];

struct trie{
    int nrc;
    int nrf;
    trie *f[26];
    trie(){
        nrc=0;
        nrf=0;
        for(int i=0; i<26; i++){
            f[i]=NULL;
        }

    }
}*date;

void Adaugare(trie *nod,char *sir){
    if(*sir!=0){
        if(nod->f[*sir-'a']==NULL){
            nod->nrf++;
            nod->f[*sir-'a']=new trie;
        }
        Adaugare(nod->f[*sir-'a'],sir+1);

    }
    else{
        nod->nrc++;
    }

}

int Stergere(trie *nod,char *sir){
    if(*sir==0){
        nod->nrc--;
        if(nod->nrc==0 && nod->nrf==0 && nod!=date){
            delete nod;
            return 1;
        }
        return 0;
    }

    if(Stergere(nod->f[*sir-'a'],sir+1)){
        nod->nrf--;
        if(nod->nrc==0 && nod->nrf==0 && nod!=date){
            delete nod;
            return 1;
        }
        return 0;
    }
    return 0;
}

int Aparitie(trie *nod,char *sir){
    if(*sir==0){
        return nod->nrc;
    }
    if(nod->f[*sir-'a']==NULL){
        return 0;
    }
    return Aparitie(nod->f[*sir-'a'],sir+1);
}

int LgPrefix(trie *nod,char *sir){
    if(*sir==0){
        return 0;
    }
    if(nod->f[*sir-'a']==NULL){
        return 0;
    }
    return LgPrefix(nod->f[*sir-'a'],sir+1)+1;
}



int main(){
    date=new trie;
    while(fin>>cerinta){
        fin>>cuvant;
        if(cerinta==0){
            Adaugare(date,cuvant);
        }
        if(cerinta==1){
            Stergere(date,cuvant);
        }
        if(cerinta==2){
            fout<<Aparitie(date,cuvant)<<"\n";
        }
        if(cerinta==3){
            fout<<LgPrefix(date,cuvant)<<"\n";
        }
    }

    return 0;
}