Cod sursa(job #3292767)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 9 aprilie 2025 11:49:59
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.31 kb
#include <fstream>

using namespace std;

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

const int SIGMA = 26;

struct trie{
    int cate_prefix, aparitii;
    unsigned lungime;
    trie *urmator[SIGMA] = {};

    trie(int marime, bool eRadacina){
        lungime = marime;
        cate_prefix = aparitii = eRadacina;
    }

    void creeaza_fiu(int poz){
        if(!urmator[poz]){
            urmator[poz] = new trie(lungime + 1, 0);
        }
    }

    void adaugare(string sir){
        cate_prefix++;

        if(lungime == sir.size()){
            aparitii++;
            return;
        }
        creeaza_fiu(sir[lungime] - 'a');
        urmator[sir[lungime] - 'a']->adaugare(sir);
    }

    void stergere(string sir){
        cate_prefix--;
        if(lungime == sir.size()){
            aparitii--;
            return;
        }

        if(urmator[sir[lungime] - 'a']){
            urmator[sir[lungime] - 'a']->stergere(sir);
            if(urmator[sir[lungime] - 'a']->cate_prefix == 0){
                urmator[sir[lungime] - 'a'] = nullptr;
            }
        }
    }

    int cate_aparitii(string sir){
        if(lungime == sir.size()){
            return aparitii;
        }

        if(urmator[sir[lungime] - 'a']){
            return urmator[sir[lungime] - 'a']->cate_aparitii(sir);
        }
        else{
            return 0;
        }
    }

    int prefix_maxim(string sir){
        if(lungime == sir.size()){
            return lungime;
        }

        if(urmator[sir[lungime] - 'a']){
            return urmator[sir[lungime] - 'a']->prefix_maxim(sir);
        }
        else{
            return lungime;
        }
    }
};

int tip;
string sir;
trie radacina_trie(0, 1);

bool citire_interogare(){
    if(fin >> tip){
        fin >> sir;
        return 1;
    }
    else{
        return 0;
    }
}

void rezolvare_interogare(){
    if(tip == 0){
        radacina_trie.adaugare(sir);
    }
    else if(tip == 1){
        radacina_trie.stergere(sir);
    }
    else if(tip == 2){
        fout << radacina_trie.cate_aparitii(sir) << '\n';
    }
    else{
        fout << radacina_trie.prefix_maxim(sir) << '\n';
    }
}

int main(){
    while(citire_interogare()){
        rezolvare_interogare();
    }

    return 0;
}