Cod sursa(job #3355691)

Utilizator darius_cimbruDarius Cimbru darius_cimbru Data 25 mai 2026 00:44:50
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <bits/stdc++.h>
#include <fstream>
using namespace std;

// fiecare nod tine sfarsit (cate cuvinte termina aici) si treceri (cate cuvinte trec prin nod)
// erase decrementeaza si sterge in lant nodurile care raman complet goale (treceri=0 si sfarsit=0)

struct Nod {
    int sfarsit;
    int treceri;
    Nod *copii[26];
};

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

    Nod *radacina = new Nod();

    int op;
    string s;
    while(fin>>op>>s){
        int len=s.size();
        if(op==0){
            Nod *p=radacina;
            for(int i=0;i<len;i++){
                int idx=s[i]-'a';
                if(p->copii[idx]==NULL) p->copii[idx]=new Nod();
                p=p->copii[idx];
                p->treceri++;
            }
            p->sfarsit++;
        }
        else if(op==1){
            Nod *cale[25];
            Nod *p=radacina;
            for(int i=0;i<len;i++){
                cale[i]=p;
                p=p->copii[s[i]-'a'];
                p->treceri--;
            }
            p->sfarsit--;
            for(int i=len-1;i>=0;i--){
                int idx=s[i]-'a';
                Nod *jos=cale[i]->copii[idx];
                if(jos->treceri==0 && jos->sfarsit==0){
                    delete jos;
                    cale[i]->copii[idx]=NULL;
                }
            }
        }
        else if(op==2){
            Nod *p=radacina;
            int ok=1;
            for(int i=0;i<len;i++){
                int idx=s[i]-'a';
                if(p->copii[idx]==NULL){ ok=0; break; }
                p=p->copii[idx];
            }
            if(ok) fout<<p->sfarsit<<"\n";
            else fout<<0<<"\n";
        }
        else {
            Nod *p=radacina;
            int lung=0;
            for(int i=0;i<len;i++){
                int idx=s[i]-'a';
                if(p->copii[idx]==NULL) break;
                p=p->copii[idx];
                lung++;
            }
            fout<<lung<<"\n";
        }
    }
    return 0;
}