Cod sursa(job #2341640)

Utilizator benjamin2205Zeic Beniamin benjamin2205 Data 12 februarie 2019 05:58:02
Problema Trie Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.02 kb
#include <bits/stdc++.h>

using namespace std;

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

struct nod_trie{
    int nr_cuv;
    int nr_fii;
    nod_trie* fii[25];
    // Constructor
    nod_trie() {
        // Initializeaza numarul de cuvinte din nodul curent
        nr_cuv = 0;
        nr_fii = 0;
        // Seteaza campurile de la 'fii' la 'fii + sizeof(fii)' cu 0
        memset(fii, 0, sizeof(fii));
    }
};

nod_trie* root = new nod_trie();

void citire();

void add_word(nod_trie* nod, char* cuv) {
    // Daca pointerul catre litera curenta e NULL (adica, daca am ajuns la
    // capatul cuvantului) incrementeaza contorul nodului curent, deoarece
    // s-a adugat complet un nou cuvant
    if (*cuv == NULL) {
        nod -> nr_cuv++;
        return;
    }
    short delta = *cuv - 'a';

    // Daca nu e creat nodul care duce in caracterul 'delta'
    if(nod -> fii[delta] == NULL){
        // Cream un nou nod trie;
        nod -> fii[delta] = new nod_trie();
        nod -> nr_fii++;
    }
    // Reapeleaza functia de adaugare, cu 'cuv+1', adica
    add_word(nod -> fii[delta], cuv + 1);
}

int find_word(nod_trie* nod, char* cuv) {


    if (*cuv == NULL) {
        return nod -> nr_cuv;
    }
    short delta = *cuv - 'a';

    if(nod -> fii[delta] == NULL){
        return 0;
    }

    // Reapeleaza functia de cautare a cuvantului
    find_word(nod -> fii[delta], cuv + 1);
}

// Se apeleaza cu un pointer catre nod si catre char
int delete_word(nod_trie* nod, char* cuv) {
    // Daca am ajuns la capatul cuvantului
    if (*cuv == NULL) {
        // Decrementam numarul de cuvinte
        nod -> nr_cuv--;
        if (nod -> nr_cuv == 0 && nod -> nr_fii == 0 && nod != root) {
            delete nod;
            return 1;
        }
        return 0;
    }

    short delta = *cuv - 'a';

    if (delete_word(nod -> fii[delta], cuv+1)) {
        nod -> nr_fii--;
        // Facem pointerul catre
        nod -> fii[delta] = 0;
        // Verificam si nodul curent, sa vedem daca
        if (nod -> nr_cuv == 0 && nod -> nr_fii == 0 && nod != root) {
            delete nod;
            return 1;
        }
    }
    return 0;
}

int prefix(nod_trie* nod, char* cuv) {
    if (*cuv == 0) {
        return 0;
    }

    // Transformam literele de la a la z in cifre dela 1 la 27
    short delta = *cuv - 'a';

    if (nod -> fii[delta] == 0) {
        return 0;
    }

    return 1 + prefix(nod -> fii[delta], cuv+1);

}

int main()
{
    int nr;
    char cuv[22];

    while(!f.eof()) {
        f >> nr;
        f >> cuv;

        if (f.eof())
                break;

        if (nr == 0) {
            add_word(root, cuv);
        }
        else if (nr == 1) {
            delete_word(root, cuv);
        }
        else if (nr == 2) {
            g <<  find_word(root, cuv) << '\n';
        }
        else if (nr == 3) {
            g << prefix(root, cuv) << '\n';
        }

        //cout << cuv << '\n';
    }

    return 0;
}