Cod sursa(job #2064785)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 12 noiembrie 2017 20:08:09
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2 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[30];
}NOD;

NOD * arbore;

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

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

int tiparire(NOD * parcurg, char x[30], int poz){
    if(x[poz] == '\0'){
        return parcurg -> info ;
    }
    if(parcurg -> urm[x[poz] - 'a' + 1] != 0){
        tiparire(parcurg -> urm[x[poz] - 'a' + 1],x , poz + 1);
    }
}

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

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

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

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