Cod sursa(job #2503471)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 3 decembrie 2019 10:52:39
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <bits/stdc++.h>

using namespace std;

struct TrieNode
{
    int counter = 0;
    unordered_map<char, TrieNode*> child;
} *trieRoot{new TrieNode};

void trie_push(char* word)
{
    TrieNode* node = trieRoot;

    for(int i = 0; word[i] != '\0'; ++i)
    {
        if(node->child.find(word[i]) == node->child.end())
            node->child[word[i]] = new TrieNode;

        node = node->child[word[i]];
    }

    node->counter++;
}

TrieNode* trie_delete(char* word, TrieNode* node = trieRoot)
{
    char character = word[0];

    if(character == '\0')
    {
        node->counter--;
        return node;
    }

    TrieNode* child = node->child[character];

    child = trie_delete(word + 1, child);

    if(child->counter == 0 && child->child.empty() == true)
        node->child.erase(character);

    return node;
}

int trie_count(char* word)
{
    TrieNode* node = trieRoot;

    for(int i = 0; word[i] != '\0'; ++i)
    {
        node = node->child[word[i]];
    }

    return node->counter;
}

int trie_longest_prefix(char* word)
{
    TrieNode* node = trieRoot;

    int length = 0;

    for(int i = 0; word[i] != '\0'; ++i)
    {
        if(node->child.find(word[i]) == node->child.end())
           break;

        node = node->child[word[i]];

        length++;
    }

    return length;
}

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

    int queryType;
    char* word = new char[21];

    while(fin >> queryType >> word)
    {
        if(queryType == 0)
            trie_push(word);

        if(queryType == 1)
            trie_delete(word);

        if(queryType == 2)
            fout << trie_count(word) << '\n';

        if(queryType == 3)
            fout << trie_longest_prefix(word) << '\n';
    }
}