Cod sursa(job #2987577)

Utilizator SabailaCalinSabaila Calin SabailaCalin Data 2 martie 2023 15:22:10
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.32 kb
#include <iostream>
#include <fstream>

using namespace std;

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

struct TrieNode
{
    int counter = 0;
    int is_in_words = 0;
    TrieNode *children[30] = { NULL };
};

void Push(TrieNode *&root, string word)
{
    TrieNode *curr = root;
    int len = word.length();

    for (int i = 0; i < len; i++)
    {
        int index = word[i] - 'a';
        if (curr -> children[index] == NULL)
        {
            curr -> children[index] = new TrieNode;
        }
        curr = curr -> children[index];
        curr -> is_in_words++;
    }

    curr -> counter++;
}

void Pop(TrieNode *&root, string word)
{
    TrieNode *curr = root;
    int len = word.length();

    for (int i = 0; i < len; i++)
    {
        int index = word[i] - 'a';
        if (curr -> children[index] == NULL)
        {
            return;
        }
        curr = curr -> children[index];
        curr -> is_in_words--;
    }

    if (curr -> counter > 0)
    {
        curr -> counter--;
    }
}

int Frequency(TrieNode *root, string word)
{
    TrieNode *curr = root;
    int len = word.length();

    for (int i = 0; i < len; i++)
    {
        int index = word[i] - 'a';
        if (curr -> children[index] == NULL)
        {
            return 0;
        }
        curr = curr -> children[index];
    }

    return curr -> counter;
}

int LongestPrefix(TrieNode *root, string word)
{
    TrieNode *curr = root;
    int len = word.length();
    int cnt = 0, maximum = 0;

    for (int i = 0; i < len; i++)
    {
        int index = word[i] - 'a';
        if (curr -> children[index] == NULL)
        {
            return maximum;
        }
        curr = curr -> children[index];
        cnt++;
        if (curr -> is_in_words > 0)
        {
            maximum = cnt;
        }
    }

    return maximum;
}

int main()
{
    TrieNode *root = new TrieNode;
    int query;
    while(f >> query) {
        string word;
        f >> word;
        if(query == 0) {
            Push(root, word);
        } else if(query == 1) {
            Pop(root, word);
        } else if(query == 2) {
            g << Frequency(root, word) << '\n';
        } else {
            g << LongestPrefix(root, word) << '\n';
        }
    }
    return 0;
}