Cod sursa(job #3217814)

Utilizator sireanu_vladSireanu Vlad sireanu_vlad Data 24 martie 2024 19:49:26
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.51 kb
#include <iostream>
using namespace std;

#define LMAX 20

struct Nod {
    unsigned nrAp, nrSons;
    Nod* lit[26];
    Nod() {
        nrAp = 0;
        nrSons = 0;
        for (unsigned i = 0; i < 26; i += 1) {
            lit[i] = 0;
        }
    }
};

Nod* Trie;

void adauga(char* cuv) {
    Nod* it = Trie;
    for (unsigned i = 0; cuv[i] != 0; i += 1) {
        unsigned ind = cuv[i] - 'a'; 
        if (it->lit[ind] == nullptr) {
            it->lit[ind] = new Nod;
            it->nrSons += 1;
        }
        it = it->lit[ind];
    }
    it->nrAp += 1;
}

unsigned aparitii(char* cuv) {
    Nod* it = Trie;
    for (unsigned i = 0; cuv[i] != 0; i += 1) {
        unsigned ind = cuv[i] - 'a'; 
        if (it->lit[ind] == nullptr) {
            return 0;
        }
        it = it->lit[ind];
    }
    return it->nrAp;
}

void sterge(char* cuv) {
    Nod* it = Trie;
    Nod* last_needed = Trie;
    unsigned del = 0;
    for (unsigned i = 0; cuv[i] != 0; i += 1) {
        unsigned ind = cuv[i] - 'a'; 
        if (it->nrSons > 0 || it->nrAp > 0) {
            last_needed = it;
            del = i;
        }
        it = it->lit[ind];
    }

    it->nrAp -= 1;
    if (it->nrAp > 0 || it->nrSons > 0) {
        return;
    }

    last_needed->nrSons -= 1;
    it = last_needed->lit[cuv[del] - 'a'];
    last_needed->lit[cuv[del] - 'a'] = nullptr;

    for (unsigned i = del + 1; cuv[i] != 0; i += 1) {
        unsigned ind = cuv[i] - 'a'; 
        Nod* t = it;
        it = it->lit[ind];
        delete t;
    }
    delete it;
}

unsigned prefix(char* cuv) {
    Nod* it = Trie;
    unsigned i = 0;
    for (i = 0; cuv[i] != 0; i += 1) {
        unsigned ind = cuv[i] - 'a'; 
        if (it->lit[ind] == nullptr) {
            return i;
        }
        it = it->lit[ind];
    }
    return i;
}

int main() {
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);

    char line[2 + LMAX + 1];
    Trie = new Nod;

    while (cin.getline(line, LMAX)) {
        switch (line[0]) {
            case '0':
                adauga(line + 2);
                break;
            case '1':
                sterge(line + 2);
                break;
            case '2':
                cout << aparitii(line + 2) << '\n';
                break;
            case '3':
                cout << prefix(line + 2) << '\n';
                break;
            default:
                cout << "cod gresit\n";
        }
    }

    return 0;
}