Cod sursa(job #3347827)

Utilizator TeodorVTeodorV TeodorV Data 18 martie 2026 15:29:01
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 kb
#include <bits/stdc++.h>

using namespace std;

const string NUMEFISIER="trie";
ifstream fin(NUMEFISIER+".in");
ofstream fout(NUMEFISIER+".out");


const int Nrlit='z'-'a'+1;

struct Node{

    int nrPrefix,nrCuv;
    Node* f[Nrlit];

    Node(){
        nrPrefix=nrCuv=0;
        for(int i=0; i<Nrlit; i++)
            f[i]=nullptr;
    }
};

class Arbore{

    Node* root;

    Node* add_rec(char cuv[], Node* node){

        if(node==nullptr)
            node=new Node();

        node->nrPrefix++;
        if(cuv[0]=='\0')
            node->nrCuv++;
        else
            node->f[cuv[0]-'a']=add_rec(cuv+1, node->f[cuv[0]-'a']);
        return node;
    }
    Node* remove_rec(char cuv[], Node* node){

        node->nrPrefix--;
        if(cuv[0]=='\0')
            node->nrCuv--;
        else
            node->f[cuv[0]-'a']=remove_rec(cuv+1, node->f[cuv[0]-'a']);
        if(node->nrPrefix==0){
            delete node;
            node=nullptr;
        }
        return node;
    }
    int aparitii_rec(char cuv[], Node* node){
        if(node==nullptr) return 0;

        if(cuv[0]=='\0')
            return node->nrCuv;
        return aparitii_rec(cuv+1, node->f[cuv[0]-'a']);
    }

    int lungimePrefix_rec(char cuv[], Node* node){
        if(node==nullptr) return -1;

        if(cuv[0]=='\0')
            return 0;
        return 1+lungimePrefix_rec(cuv+1, node->f[cuv[0]-'a']);
    }

public:
    Arbore(){
        root=nullptr;
    }

    void add(char cuv[]){
        root=add_rec(cuv, root);
    }
    void remove(char cuv[]){
        root=remove_rec(cuv, root);
    }
    int aparitii(char cuv[]){
        return aparitii_rec(cuv, root);
    }
    int lungimePrefix(char cuv[]){
        return lungimePrefix_rec(cuv, root);
    }
};

int main()
{
    int tip;
    char cuv[21];
    Arbore arb;
    while(fin>>tip>>cuv){

        switch(tip)
        {
        case 0:
            arb.add(cuv);
            break;
        case 1:
            arb.remove(cuv);
            break;
        case 2:
            fout<<arb.aparitii(cuv)<<'\n';
            break;
        case 3:
            fout<<arb.lungimePrefix(cuv)<<'\n';
            break;
        }
    }
    return 0;
}