Cod sursa(job #2582109)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 16 martie 2020 13:36:04
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 kb
#include <bits/stdc++.h>
#define ALPHABET_SIZE 26

using namespace std;

struct Trie
{
    int vf, cntSons;
    Trie* v[ALPHABET_SIZE];

    Trie()
    {
        vf = cntSons = 0;

        memset(v, 0, sizeof(v));
    }
};

Trie *root = new Trie;

inline int getId(const char &c)
{
    return c - 'a';
}

void push(const string &s)
{
    Trie *nodeCurrent = root;
    int idx = 0, n = s.length();

    while(idx < n)
    {
        if(!nodeCurrent->v[getId(s[idx])])
        {
            nodeCurrent->cntSons++;
            nodeCurrent->v[getId(s[idx])] = new Trie;
        }

        nodeCurrent = nodeCurrent->v[getId(s[idx])];

        idx++;
    }

    nodeCurrent->vf++;
}

int pop(Trie *node, const string &s)
{
    if(!s.length())
        node->vf--;

    else
    {
        string sCopy = s.substr(1, s.length());
        if(pop(node->v[getId(s[0])], sCopy))
        {
            node->v[getId(s[0])] = 0;
            node->cntSons--;
        }
    }

    if(!node->cntSons && !node->vf && node != root)
    {
        delete node;
        return 1;
    }

    return 0;
}

int nrAparitii(const string &s)
{
    Trie *nodeCurrent = root;
    int idx = 0, n = s.length();

    while(nodeCurrent && idx < n)
    {
        nodeCurrent = nodeCurrent->v[getId(s[idx])];

        idx++;
    }

    if(!nodeCurrent)return 0;

    return nodeCurrent->vf;
}

int longestPrefix(const string &s)
{
    Trie *nodeCurrent = root;
    int idx = 0, n = s.length();

    while(nodeCurrent && idx < n)
    {
        nodeCurrent = nodeCurrent->v[getId(s[idx])];

        idx++;
    }

    if(nodeCurrent)return n;
    return idx - 1;
}

int main()
{
    ifstream fin("trie.in");
    ofstream fout("trie.out");

    ios::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    srand(time(NULL));

    int c;
    string s;

    while(fin >> c >> s)
    {
        if(c == 0)push(s);
        else if(c == 1)pop(root, s);
        else if(c == 2)fout << nrAparitii(s) << '\n';
        else fout << longestPrefix(s) << '\n';
    }

    fin.close();
    fout.close();

    return 0;
}