Cod sursa(job #2987712)

Utilizator SabailaCalinSabaila Calin SabailaCalin Data 2 martie 2023 18:24:13
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.38 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int LETTERS_IN_ALPHABET = 26;

struct TrieNode
{
    int cnt = 0, endOfWord = 0;
    TrieNode *children[LETTERS_IN_ALPHABET] = { NULL };
};

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

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

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

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

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

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

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

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

int main()
{
    TrieNode *root = new TrieNode;
    int option; string s;

    while (f >> option >> s)
    {
        switch (option)
        {
            case 0:
                Push(root, s);
                break;
            case 1:
                Pop(root, s);
                break;
            case 2:
                g << Frequency(root, s) << "\n";
                break;
            case 3:
                g << LongestPrefix(root, s) << "\n";
                break;
        }
    }
}