Cod sursa(job #3278328)

Utilizator jumaracosminJumara Cosmin-Mihai jumaracosmin Data 19 februarie 2025 13:11:50
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.4 kb
#include <bits/stdc++.h>

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

const int SIZE = 2e5;           // 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 0;
        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';
        node = trie[node][idx];
        frecv[node]--;
    }
    isEnd[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);

    int op;
    std::string word;
    while(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;
}