Cod sursa(job #3231167)

Utilizator cosmin_mihaiDumitru Cosmin cosmin_mihai Data 25 mai 2024 10:27:16
Problema Trie Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
//
// Created by LEGION on 5/25/2024.
//
#include<fstream>
#include<vector>
using namespace std;

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

const int NL = 26;
const int LC = 20;

struct nod {
    nod* fii[NL];
    int nr_cuv,nr_fii;
    nod() {
        nr_cuv = nr_fii=  0;
        for (int i = 0; i < NL; ++i){
             fii[i] = NULL;
        }
    }
};

nod *adaugare(nod* rad,char cuv[]) {
    if (rad==NULL) {
        rad = new nod;
    }
    if (cuv[0]=='\0') {
        rad->nr_cuv++;
        return rad;
    }
    int poz_lit = (int)(cuv[0]-'a');
    if (rad->fii[poz_lit]==NULL) {
        rad->nr_fii++;
    }
    rad->fii[poz_lit] = adaugare(rad->fii[poz_lit],cuv+1);
    return rad;
}

nod *stergere(nod* rad,char cuv[]) {
    if (cuv[0]=='\0') {
        if (rad->nr_fii==0 && rad->nr_cuv==1) {///rad e frunza
            delete rad;
            rad = NULL;
        }else {
            rad->nr_cuv--;
        }
    }else {
        int poz_lit = (int)cuv[0]-'a';
        rad->fii[poz_lit] = stergere(rad->fii[poz_lit],cuv+1);
    }
    return rad;
}

int aparitii(nod *rad,char cuv[]) {
    if(rad==NULL)
        return 0;
    if (cuv[0]=='\0') {//suntem la finalu cuvantului
        return rad->nr_cuv;
    }
    int poz_lit = (int)cuv[0]-'a';
    return aparitii(rad->fii[poz_lit],cuv+1);
}

int lung_prefix(nod*rad,char cuv[]) {
    if (rad==NULL) {
        return 0;
    }
    if (cuv[0]=='\n')
        return 0;
    int poz_lit = (int)cuv[0]-'a';
    int lung = 0;;
    if (rad->fii[poz_lit]!=NULL) {
        lung = 1+lung_prefix(rad->fii[poz_lit],cuv+1);
    }
    return lung;
}

int main(){
    char cuvant [LC+1];
    int tip;
    nod *radacina = new nod;
    while (fin >> tip >> cuvant) {
        if (tip==0)
            radacina = adaugare(radacina,cuvant);
        else if (tip==1)
            radacina = stergere(radacina,cuvant);
        else if (tip==2)
            fout << aparitii(radacina,cuvant)<<'\n';
        else
            fout << lung_prefix(radacina,cuvant)<<'\n';
    }
    return 0;
}