Cod sursa(job #2665600)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 31 octombrie 2020 09:53:05
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int NMAX = 21;
const int SIGMAX = (int)('z' - 'a' + 1);

int Q, Type;

char S[NMAX];

struct Node
{
    int ap; /// nr aparitii cuvant;
    int nr; /// nr fii activi;

    Node *Next[SIGMAX];

    Node ()
    {
        ap = nr = 0;

        for(int i = 0; i <= (int)('z' - 'a'); ++i)
            Next[i] = nullptr;
    }
} *Trie = new Node;

static inline void Update (Node *tree, char *word, int val, int rem_lett)
{
    if(rem_lett == 0)
    {
        tree -> ap += val;

        return;
    }

    int now = (int)(*word - 'a');

    if(tree -> Next[now] == nullptr)
        tree -> Next[now] = new Node, tree -> nr += 1;

    Update(tree -> Next[now], word + 1, val, rem_lett - 1);

    ///
    if(val == -1)
    {
        Node *Son = tree -> Next[now];

        if(Son -> ap == 0 && Son -> nr == 0)
            delete(Son), tree -> Next[now] = nullptr, --tree -> nr;
    }
    ///

    return;
}

static inline int Query_Ap (Node *tree, char *word, int rem_lett)
{
    if(rem_lett == 0)
        return tree -> ap;

    int now = (int)(*word - 'a');

    if(tree -> Next[now] == nullptr)
        return 0;

    return Query_Ap(tree -> Next[now], word + 1, rem_lett - 1);
}

static inline int Query_LCP (Node *tree, char *word, int rem_lett, int lvl)
{
    if(rem_lett == 0)
        return lvl;

    int now = (int)(*word - 'a');

    if(tree -> Next[now] == nullptr)
        return lvl;

    return Query_LCP(tree -> Next[now], word + 1, rem_lett - 1, lvl + 1);
}

int main()
{
    f.tie(nullptr);

    while(f >> Type >> (S + 1))
    {
        if(Type == 0)
            Update(Trie, S + 1, 1, (int)strlen(S + 1));
        else if(Type == 1)
            Update(Trie, S + 1, -1, (int)strlen(S + 1));
        else if(Type == 2)
            g << Query_Ap(Trie, S + 1, (int)strlen(S + 1)) << '\n';
        else
            g << Query_LCP(Trie, S + 1, (int)strlen(S + 1), 0) << '\n';
    }

    return 0;
}