Cod sursa(job #3239460)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 5 august 2024 18:01:30
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.84 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 *root, char *str)
{
    Node *akt = root;

    for (int i = 0; str[i] != '\0'; i++) {
        char betu = str[i];

        if (akt->next[betu-'a'] == nullptr) {
            akt->next[betu-'a'] = new Node;
            akt = akt->next[betu-'a'];
        }
        else {
            akt = akt->next[betu-'a'];
        }
    }

    akt->nr++;
}

int hanyszor_van(Node *root, const char *str)
{
    Node *akt = root;

    for (int i = 0; str[i] != '\0'; i++) {
        char betu = str[i];

        if (akt->next[betu-'a'] == nullptr)
            return 0;

        akt = akt->next[betu-'a'];
    }

    return akt->nr;
}

void torol(Node *root, const char *str)
{
    int hossz = 0;
    Node *akt = root;

    for (int i = 0; str[i] != '\0'; i++) {
        char betu = str[i];
        ++hossz;

        if (akt->next[betu-'a'] == nullptr)
            return;

        akt = akt->next[betu-'a'];
    }

    akt->nr--;

    if (akt->nr == 0) {
        // törölni kell azokat, amik alatt nincs
        // > 0 érték
        vector<Node *> csomopontok(hossz+1);
        csomopontok[0] = root;
        int hanyadik = 1;
        Node *akt = root;

        for (int i = 0; str[i] != '\0'; i++) {
            char betu = str[i];
            akt = akt->next[betu-'a'];
            csomopontok[hanyadik] = akt;
            hanyadik++;
        }

        for (int i = hossz; i >= 1; i--) {
            // törölni kell egy pontot, ha nr-je
            // 0 és nincs gyereke
            akt = csomopontok[i];

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

            if (van_gyerek || akt->nr > 0)
                break;
            else {
                csomopontok[i-1]->next[str[i-1]-'a']
                    = nullptr;

                delete akt;
            }
        }
    }
}

int max_prefixhossz(Node *root, const char *str)
{
    Node *akt = root;
    int eredmeny = 0;

    for (int i = 0; str[i] != '\0' && akt->next[str[i]-'a'] != nullptr; i++) {
        ++eredmeny;
        akt = akt->next[str[i]-'a'];
    }

    return eredmeny;
}


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;
}