Cod sursa(job #2665632)

Utilizator alexsandulescuSandulescu Alexandru alexsandulescu Data 31 octombrie 2020 10:24:35
Problema Trie Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <fstream>
#include <cstring>

using namespace std;

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

constexpr int NMAX = 21;
constexpr int SIGMAX = 'z' - 'a' + 1;

int op;
char str[NMAX];

struct Node
{
    int ap = 0, sonSize = 0;
    Node* sons[SIGMAX];

    Node() {
        for (int i = 0; i < 25; i++) {
            sons[i] = 0;
        }
    }

    Node(int ap, int sonSize) {
        this->ap = ap;
        this->sonSize = sonSize;
        for (int i = 0; i < 25; i++) {
            sons[i] = 0;
        }
    }
};

Node* Trie = new Node;

void update(Node* trie, char* wordptr, int op, int remLetters)
{
    if (!remLetters) {
        trie->ap += op;
        return;
    }

    int curr = *wordptr - 'a';

    if (trie->sons[curr] == nullptr) trie->sons[curr] = new Node, trie->sonSize++;
        

    update(trie->sons[curr], wordptr + 1, op, remLetters - 1);

    if (op == -1) {
        Node* son = trie->sons[curr];

        if (!son->sonSize && !son->ap) {
            delete(son);
            trie->sonSize--;
            trie->sons[curr] = nullptr;
        }
            
    }
}

int queryAp(Node* trie, char* wordptr, int remLetters)
{
    if (!remLetters) return trie->ap;

    int curr = *wordptr - 'a';
    if (trie->sons[curr] == nullptr) return 0;

    return queryAp(trie->sons[curr], wordptr + 1, remLetters - 1);
}

int queryLCP(Node* trie, char* wordptr, int remLetters, int level)
{
    if (remLetters == 0) return level;

    int curr = *wordptr - 'a';
    if (trie->sons[curr] == nullptr) return level;

    return queryLCP(trie->sons[curr], wordptr + 1, remLetters - 1, level + 1);
}

int main() {
    while (f >> op >> str + 1) {
        if (op == 0) update(Trie, str + 1, 1, strlen(str + 1));
        else if (op == 1) update(Trie, str + 1, -1, strlen(str + 1));
        else if (op == 2) g << queryAp(Trie, str + 1, strlen(str + 1)) << '\n';
        else g << queryLCP(Trie, str + 1, strlen(str + 1), 0) << '\n';
    }
    return 0;
}