Cod sursa(job #2521462)

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

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;
            nod=0;
            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;
            nod=0;
            return 1;
        }

    }
    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 cerinta;
char cuvant[30];

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;
}