Cod sursa(job #2553654)

Utilizator alex02Grigore Alexandru alex02 Data 22 februarie 2020 10:51:33
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <iostream>
#include <fstream>

using namespace std;

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

struct Trie {
    Trie *copii[26] = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
                       nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
                       nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
    int con = 0;
};

string str = "";
int l_str = 0;
Trie *p = new Trie();

void inserare(Trie *nod, int index) {
    if (index == l_str) {
        ++nod->con;
        return;
    }
    int temp = str[index] - 'a';
    if (nod->copii[temp] == nullptr)
        nod->copii[temp] = new Trie();
    inserare(nod->copii[temp], index + 1);
}

void sterge(Trie *node, int index) {
    if (index == l_str) {
        --node->con;
        return;
    }
    int temp = str[index] - 'a';
    sterge(node->copii[temp], index + 1);
    if (node->copii[temp]->con == 0 && index == l_str - 1) {
        delete node->copii[temp];
        node->copii[temp] = nullptr;
    }
}

int afisare_nr(Trie *nod, int index) {
    if (index == l_str)
        return nod->con;
    int temp = str[index] - 'a';
    if (nod->copii[temp] == nullptr)
        return 0;
    return afisare_nr(nod->copii[temp], index + 1);
}

int afisare_lungime(Trie *nod, int index) {
    if (index == l_str)
        return l_str;
    int temp = str[index] - 'a';
    if (nod->copii[temp] == nullptr)
        return index;
    return afisare_lungime(nod->copii[temp], index + 1);
}

int main() {
    int comanda = 0;
    Trie radacina = *new Trie();

    while (f >> comanda >> str) {
        l_str = str.length();

        switch (comanda) {
            case 0:
                inserare(&radacina, 0);
                break;
            case 1:
                sterge(&radacina, 0);
                break;
            case 2:
                cout << afisare_nr(&radacina, 0) << endl;
                break;
            case 3:
                cout << afisare_lungime(&radacina, 0) << endl;
                break;
        }
    }

    return 0;
}