Cod sursa(job #2608678)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 1 mai 2020 17:45:51
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int SIGMA = 26;

int Type, N;
char S[25];

struct Trie
{
    int Ap;
    int cnt;

    Trie *Next[SIGMA];

    Trie ()
    {
        Ap = cnt = 0;

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

static inline void Update (Trie *p, char *S, int q)
{
    if((int)strlen(S) == 0)
    {
        p -> Ap += q;

        return;
    }

    int Now = (int)(*S - 'a');

    if(p -> Next[Now] == nullptr)
    {
        ++(p -> cnt);

        p -> Next[Now] = new Trie;
    }

    Update(p -> Next[Now], S + 1, q);

    if(q == -1)
    {
        if(p -> Next[Now] -> Ap == 0 && p -> Next[Now] -> cnt == 0)
        {
            --(p -> cnt);

            p -> Next[Now] = nullptr;
        }
    }

    return;
}

static inline int Query (Trie *p, char *S)
{
    int m = (int)strlen(S);

    for(int i = 0; i < m; ++i)
    {
        int Now = (int)(S[i] - 'a');

        if(p -> Next[Now] == nullptr)
            return 0;

        p = p -> Next[Now];
    }

    return p -> Ap;
}

static inline int LongestPrefix (Trie *p, char *S)
{
    int r = 0;
    int m = (int)strlen(S);

    for(int i = 0; i < m; ++i)
    {
        int Now = (int)(S[i] - 'a');

        if(p -> Next[Now] == nullptr)
            break;

        ++r;

        p = p -> Next[Now];
    }

    return r;
}

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

    while(f >> Type >> (S + 1))
    {
        if(Type == 0)
            Update(p, S + 1, 1);
        else if(Type == 1)
            Update(p, S + 1, -1);
        else if(Type == 2)
            g << Query(p, S + 1);
        else
            g << LongestPrefix(p, S + 1);

        if(Type > 1)
            g << '\n';
    }

    return 0;
}