Cod sursa(job #2449237)

Utilizator xtreme77Patrick Sava xtreme77 Data 18 august 2019 22:18:06
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.44 kb
#include <fstream>
#include <cstring>
#include <cassert>

using namespace std;

ifstream cin ("trie.in");
ofstream cout ("trie.out");

const int SIGMA = 26;

struct Trie
{
    int freq;
    int leaf;
    Trie *neigh[SIGMA];
    Trie()
    {
        this->freq = 0;
        this->leaf = 0;
        memset(this->neigh, NULL, sizeof(this->neigh));
    }
};

Trie *Root = new Trie();

namespace operations {
    void insert(Trie *&node, string &seq, int ind)
    {
        node -> freq += 1;
        if (ind == seq.size())
        {
            node -> leaf += 1;
            return;
        }
        else
        {
            int where_to_go = seq[ind] - 'a';
            if (node -> neigh[where_to_go] == nullptr)
                node -> neigh[where_to_go] = new Trie();
            insert(node -> neigh[where_to_go], seq, ind + 1);
        }
    }
    void remove(Trie *&node, string &seq, int ind)
    {
        node-> freq -= 1;
        if (ind == seq.size())
        {
            node -> leaf -= 1;
        }
        else
        {
            int where_to_go = seq[ind] - 'a';
            remove(node->neigh[where_to_go], seq, ind + 1);
        }
        if (node != Root and node -> freq == 0)
            delete node, node = nullptr;
    }
    int get_frequency_for_word(Trie *&node, string &seq, int ind)
    {
        if (ind == seq.size())
            return node -> leaf;

        int where_to_go = seq[ind] - 'a';
        if (node->neigh[where_to_go] != nullptr)
            return get_frequency_for_word(node->neigh[where_to_go], seq, ind + 1);

        return 0;
    }
    int get_longest_common_prefix(Trie *&node, string &seq, int ind)
    {
        if (node -> freq > 0 and ind < (int)seq.size())
        {
            int where_to_go = seq[ind] - 'a';
            if (node -> neigh[where_to_go] != nullptr)
                return get_longest_common_prefix(node -> neigh[where_to_go], seq, ind + 1);
        }
        return ind;
    }
}

int main() {
    int type;
    string s;
    while (cin >> type >> s)
    {
        if (type == 0)
        {
            operations::insert(Root, s, 0);
        }
        else if (type == 1)
        {
            operations::remove(Root, s, 0);
        }
        else if (type == 2)
        {
            cout << operations::get_frequency_for_word(Root, s, 0) << '\n';
        }
        else
        {
            assert(type == 3);
            cout << operations::get_longest_common_prefix(Root, s, 0) << '\n';
        }
    }
    return 0;
}