Cod sursa(job #2572137)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 5 martie 2020 11:52:05
Problema Trie Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.27 kb
#include <bits/stdc++.h>
using namespace std;

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


struct TrieNode
{
    int contor = 0;
    unordered_map<char, TrieNode*> child;
};

TrieNode* root = new TrieNode;

TrieNode* push_trie(string& word, size_t poz = 0, TrieNode* node = root)
{
    if(poz == word.size())
    {
        node->contor++;
        return node;
    }

    if(node->child.find(word[poz]) == node->child.end())
    {
        node->child[word[poz]] = new TrieNode;
    }

    node->child[word[poz]] = push_trie(word, poz + 1, node->child[word[poz]]);

    return node;
}



TrieNode* delete_trie(string& word, size_t poz = 0, TrieNode* node = root)
{
    if(poz == word.size())
    {
        node->contor--;

        if(node->contor == 0)
        {
            bool empty_node = true;

            for(char c = 'a'; c <= 'z'; ++c)
            {
                if(node->child.find(word[poz]) != node->child.end())
                {
                    empty_node = false;
                    break;
                }
            }

            if(empty_node == true) return nullptr;
        }

        return node;
    }

    node->child[word[poz]] = delete_trie(word, poz + 1, node->child[word[poz]]);

    if(node->child[word[poz]] == nullptr) node->child.erase(word[poz]);

    return node;
}


int search_trie(string& word, size_t poz = 0, TrieNode* node = root)
{
    if(poz == word.size())
        return node->contor;

    if(node->child.find(word[poz]) == node->child.end())
        return 0;

    return search_trie(word, poz + 1, node->child[word[poz]]);
}


int cmlpc_trie(string& word, size_t poz = 0, TrieNode* node = root)
{
    if(poz == word.size()) return poz;

    if(node->child.find(word[poz]) == node->child.end()) return poz;

    return cmlpc_trie(word, poz + 1, node->child[word[poz]]);
}


int main()
{
    string word;
    int c;

    while(fin >> c >> word)
    {
        if(c == 0)
            push_trie(word);
        else
            if(c == 1)
                delete_trie(word);
            else
                if(c == 2)
                    fout << search_trie(word) << '\n';
                else
                    fout << cmlpc_trie(word) << '\n';
    }
}