Cod sursa(job #3239468)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 5 august 2024 18:19:22
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

struct Node
{
    int nr = 0;

    Node *next['z'-'a'+1] = {};
        /*
            next[0] -> 'a'
            next[1] -> 'b'
            ...
            next[25] -> 'z'
        */
};

void betesz(Node *&akt, const char *str)
{
    if (akt == nullptr)
        akt = new Node;

    if (*str == '\0')
        akt->nr++;
    else
        betesz(akt->next[*str - 'a'], str+1);
}

int hanyszor_van(Node *akt, const char *str)
{
    if (akt == nullptr)
        return 0;

    if (*str == '\0')
        return akt->nr;

    return hanyszor_van(akt->next[*str - 'a'], str+1);
}

void torol(Node *&akt, const char *str)
{
    if (akt == nullptr)
        return;

    if (*str == '\0')
        akt->nr--;
    else
        torol(akt->next[*str - 'a'], str+1);

    if (akt->nr == 0) {
        bool van_gyerek = false;
        for (char c = 'a'; c <= 'z'; c++)
            if (akt->next[c-'a'] != nullptr) {
                van_gyerek = true;
                break;
            }

        if (!van_gyerek) {
            delete akt;
            akt = nullptr;
        }
    }
}

/*int max_prefixhossz(Node *akt, const char *str)
{
    if (akt == nullptr)
        return -1; // mert eggyel több "1+" volt...

    if (*str == '\0')
        return 0;

    return 1 + max_prefixhossz(akt->next[*str - 'a'], str+1);
}*/

int max_prefixhossz(Node *akt, const char *str)
{
    if (*str == '\0' || akt->next[*str - 'a'] == nullptr)
        return 0;

    return 1 + max_prefixhossz(akt->next[*str - 'a'], str+1);
}


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

    Node *root = new Node;

    int tipus;
    char szo[25];

    while (fin >> tipus >> szo) {
        if (tipus == 0)
            betesz(root, szo);
        else if (tipus == 1)
            torol(root, szo);
        else if (tipus == 2)
            fout << hanyszor_van(root, szo) << endl;
        else
            fout << max_prefixhossz(root, szo) << endl;
    }

    return 0;
}