Cod sursa(job #2064650)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 12 noiembrie 2017 17:34:42
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

typedef struct element{
    int info, nr;
    element * urm[21];
}NOD;

NOD * arbore;

void initializare(){
    arbore -> info = 0;
    arbore -> nr = 0;
    memset(arbore -> urm , 0, sizeof(arbore -> urm));
}

void adaugareArbore(NOD *parcurg, char x[21], int poz) {
    if(x[poz] == '\0'){//am ajuns la sf unui cuvant
        parcurg -> info ++;
        return;
    }
    if(parcurg ->urm[x[poz] - 'a'] == 0){//se shimba prefixul -> construim o alta ramura
        parcurg -> nr ++;
        parcurg->urm[x[poz] - 'a'] = new element;//x[poz] - 'a' transform in numar
    }
    adaugareArbore(parcurg -> urm[x[poz] - 'a'], x, poz + 1);
}

int stergereArbore(NOD *parcurg, char x[21], int poz){
    if(x[poz] == '\0'){
        parcurg -> info--;
    }else if(stergereArbore(parcurg->urm[x[poz] - 'a'],x , poz + 1)){
        parcurg -> nr --;
        parcurg -> urm[x[poz] - 'a'] = 0;
    }
    if(parcurg -> nr == 0 && parcurg -> info == 0 && parcurg != arbore){
        delete(parcurg);
        return 1;
    }
    return 0;
}

void tiparire(NOD * parcurg, char x[21], int poz){
    if(x[poz] == '\0'){
        out << parcurg -> info <<'\n';
    }else{
        tiparire(parcurg -> urm[x[poz] - 'a'],x , poz + 1);
    }
}

int lungimePrefix(NOD * parcurg, char x[21], int poz){
    if(x[poz] == '\0' || parcurg -> urm[x[poz] - 'a'] == 0){
        return 0;
    }else{
        return  1 + lungimePrefix(parcurg -> urm[x[poz] - 'a'], x, poz + 1);
    }
}

void rezolvare(int operatie, char cuv[21]){
    if(operatie == 0){
        adaugareArbore(arbore, cuv, 0);
    }else if(operatie == 1){
        stergereArbore(arbore, cuv, 0);
    }else if(operatie == 2){
        tiparire(arbore, cuv, 0);
    }else{
        out << lungimePrefix(arbore, cuv, 0) << '\n';
    }
}

void citire(){
    int operatie;
    char cuv[21];
    arbore = new NOD;
    initializare();
    while(in >> operatie >> cuv){
        rezolvare(operatie, cuv);
    }
}

int main() {
    citire();
    return 0;
}