Cod sursa(job #3278319)

Utilizator jumaracosminJumara Cosmin-Mihai jumaracosmin Data 19 februarie 2025 12:59:06
Problema Trie Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.7 kb
#include <bits/stdc++.h>

std::ifstream fin("trie.in");
std::ofstream fout("trie.out");

const int SIZE = 1e5;           // dimensiunea maxima a unui cuvant
const int ALPHABET_SIZE = 26;   // dimensiunea alfabetului folosit, aici avem 26 ('a'..'z'), putem avea 2 daca avem numai 1 si 0

int trie[SIZE][ALPHABET_SIZE];  // matricea prin care vom reprezenta tria (merge si cu pointeri, insa este mai lenta)
int isEnd[SIZE];                // sfarsitul unui cuvant
int nodes = 1;                  // numarul de noduri, de asemenea node 0 este radacina (root)
int frecv[SIZE];
//
// Inserarea in trie - iterativ
//

void Insert(std::string text)
{
    int node = 0;
    for(char ch : text)
    {
        int idx = ch - 'a';
        if(!trie[node][idx])
            trie[node][idx] = nodes++;
        node = trie[node][idx];
        frecv[node]++;
    }
    isEnd[node]++;
}

//
// Cautarea in trie - iterativ
//

int Search(std::string text)
{
    int node = 0;
    for(char ch : text)
    {
        int idx = ch - 'a';
        if(!trie[node][idx])
            return false;
        node = trie[node][idx];
    }
    return isEnd[node];
}


//
// Stergerea in trie - recursiv (iterativ - greu de implementat si mai putin intuitiv ig)
//

void Delete(std::string text)
{
    int node = 0;
    for(char ch : text)
    {
        int idx = ch - 'a';
        if(!trie[node][idx])
            return;
        node = trie[node][idx];
    }
    if(isEnd[node])
    {
        isEnd[node]--;
        trie[node][text.back() - 'a']--;
        node = 0;
        for(char ch : text)
        {
            int idx = ch - 'a';
            node = trie[node][idx];
            frecv[node]--;
        }
    }
}

//
// Cel mai lung prefix comun al lui TXT cu oricare alt cuvant
//

int LongestPrefix(std::string text)
{
    int node = 0;
    int len = 0;
    for(char ch : text)
    {
        int idx = ch - 'a';
        if(!trie[node][idx])
            break;
        node = trie[node][idx];
        if(frecv[node])
            len++;
        else
            break;
    }
    return len;
}

int main() 
{
    std::ios_base::sync_with_stdio(false);
    fin.tie(nullptr);

    while(!fin.eof())
    {
        int op;
        std::string word;

        fin >> op >> word;
        switch(op)
        {
            case 0:
                Insert(word);
                break;
            case 1:
                Delete(word);
                break;
            case 2:
                fout << Search(word) << "\n";
                break;
            case 3:
                fout << LongestPrefix(word) << "\n";
                break;
        }
    }

    return 0;
}