Cod sursa(job #3349125)

Utilizator iulia_morariuIuli Morariu iulia_morariu Data 25 martie 2026 16:53:04
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <climits>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
// #include <bits/std++.h>
#define in  fin
#define out fout

using namespace std;

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

struct node{
    int cnt; // cate is FIX eu
    int all; // cate is in total cu prefixul eu
    node* nx[26];

    node(){
        cnt = all = 0;
        for(int i = 0; i < 26; i++) nx[i] = NULL;
    }
};

node* root = new node();

void add_cuvant(node* eu, string cuv, int it){
    if(eu->nx[ cuv[it] - 'a' ] == NULL){
        eu->nx[ cuv[it] - 'a' ] = new node();
    }
    eu->all -= eu->nx[ cuv[it] - 'a' ]->all;

    if(it == cuv.size()){
        eu->cnt++;
        eu->all++;
    }else add_cuvant(eu->nx[ cuv[it] - 'a' ], cuv, it + 1);

    eu->all += eu->nx[ cuv[it] - 'a' ]->all;
}

void elim_cuvant(node* eu, string cuv, int it){
    eu->all -= eu->nx[ cuv[it] - 'a' ]->all;
    if(it == cuv.size()){
        eu->cnt--;
        eu->all--;
    }else elim_cuvant(eu->nx[ cuv[it] - 'a' ], cuv, it + 1);
    eu->all += eu->nx[ cuv[it] - 'a' ]->all;
}

int nr_ap(node* eu, string cuv, int it){
    if(eu->nx[ cuv[it] - 'a' ] == NULL){
        // eu->nx[ cuv[it] - 'a' ] = new node();
        return 0;
    }

    if(it == cuv.size()){
        return eu->cnt;
    }else return nr_ap(eu->nx[ cuv[it] - 'a' ], cuv, it + 1);
}

int pref_max(node* eu, string cuv, int it){
    if(it != cuv.size() && eu->nx[ cuv[it] - 'a' ] != NULL && eu->nx[ cuv[it] - 'a' ]->all > 0){
        return pref_max(eu->nx[ cuv[it] - 'a' ], cuv, it + 1);
    }else return it;
}

signed main(){
    ios_base::sync_with_stdio(false);
    in.tie(NULL);

    while(!fin.eof()){
        int x; string s; in >> x >> s;
        if(x == 0) add_cuvant(root, s, 0);
        else if(x == 1) elim_cuvant(root, s, 0);
        else if(x == 2) out << nr_ap(root, s, 0) << '\n';
        else if(x == 3) out << pref_max(root, s, 0) << '\n';
    }

    return 0;
}