Cod sursa(job #2665640)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 31 octombrie 2020 10:30:51
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <bits/stdc++.h>

using namespace std;

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

constexpr int SIGMA = 26;
constexpr int NMAX = 25;

char s[NMAX];

struct Node {
    int cnt;
    int fii;

    Node *Next[SIGMA];

    Node () {
        cnt = 0;
        fii = 0;

        for (int i = 0; i <= 25; ++ i )
            Next[i] = nullptr;
    }
};

Node *Tree = new Node;

void Update (Node *Tree, char *cuvant, int val, int Nr_Lit) {
    if (Nr_Lit == 0) {
        Tree->cnt += val;

        return;
    }

    int lit = (int)(*cuvant - 'a');

    if (Tree->Next[lit] == nullptr) {
        ++ Tree->fii;
        Tree -> Next[lit] = new Node;
    }

    Update(Tree -> Next[lit], cuvant + 1, val, Nr_Lit - 1);

    if (val == -1) {
        Node *F = Tree -> Next[lit];

        if (F -> cnt == 0 && F -> fii == 0) {
            delete(F);
            -- Tree -> fii;
            Tree -> Next[lit] = nullptr;
        }
    }
}

int Query_Ap (Node *Tree, char *cuvant, int Nr_Lit) {
    if (Nr_Lit == 0) return Tree -> cnt;

    int lit = (int)(*cuvant - 'a');

    if (Tree -> Next[lit] == nullptr)
        return 0;

    return Query_Ap(Tree -> Next[lit], cuvant+1, Nr_Lit-1);
}

int Query_LCP (Node *Tree, char *cuvant, int Nr_Lit, int Level) {
    if (Nr_Lit == 0)
        return Level;

    int lit = (int)(*cuvant-'a');

    if (Tree -> Next[lit] == nullptr)
        return Level;

    return Query_LCP(Tree -> Next[lit], cuvant + 1, Nr_Lit - 1, Level+1);
}

int main()
{
    int T;

    while (f >> T >> (s+1)) {
        if (T == 0) Update(Tree, (s+1), 1, strlen(s+1));
        else if (T == 1) Update(Tree, (s+1), -1, strlen(s+1));
        else if (T == 2) {
            g << Query_Ap(Tree, (s+1), strlen(s+1)) << '\n';
        }
        else g << Query_LCP(Tree, (s+1), strlen(s+1), 0) << '\n';
    }
    return 0;
}