Cod sursa(job #3351724)

Utilizator PetruApostolApostol Mihnea Petru PetruApostol Data 21 aprilie 2026 09:45:46
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
using namespace std;

ifstream cin("trie.in");
ofstream cout("trie.out");

int nextnodliber,max1;
string s;

struct strie{
    int cnt=0,cntp=0;
    int next[26]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
} trie[3000001];

void build_trie(int nod,int poz){
    trie[nod].cntp++;
    if(poz==s.size()){
        trie[nod].cnt++;return;
    }
    if(trie[nod].next[s[poz]-'a']==-1){
        trie[nod].next[s[poz]-'a']=nextnodliber;nextnodliber++;
    }
    build_trie(trie[nod].next[s[poz]-'a'],poz+1);
}

void scad_trie(int nod,int poz){
    trie[nod].cntp--;
    if(poz==s.size()){
        trie[nod].cnt--;return;
    }
    if(trie[nod].next[s[poz]-'a']==-1){
        trie[nod].next[s[poz]-'a']=nextnodliber;nextnodliber++;
    }
    scad_trie(trie[nod].next[s[poz]-'a'],poz+1);
}
int nr_trie(int nod,int poz){
    if(poz==s.size()){
        return trie[nod].cnt;
    }
    if(trie[nod].next[s[poz]-'a']==-1){
        trie[nod].next[s[poz]-'a']=nextnodliber;nextnodliber++;
    }
    return nr_trie(trie[nod].next[s[poz]-'a'],poz+1);
}

void max_pref(int nod,int poz){
    if(trie[nod].cntp) max1=max(max1,poz);
    if(poz==s.size()){
        return ;
    }
    if(trie[nod].next[s[poz]-'a']==-1){
        trie[nod].next[s[poz]-'a']=nextnodliber;nextnodliber++;
    }
    max_pref(trie[nod].next[s[poz]-'a'],poz+1);
}

int main()
{
    int cer;
    while(cin>>cer){
        cin>>s;
        max1=-1;
        if(cer==0) build_trie(0,0);
        else if(cer==1) scad_trie(0,0);
        else if(cer==2) cout<<nr_trie(0,0)<<"\n";
        else{
            max_pref(0,0);
            cout<<max1<<"\n";
        }
    }

    return 0;
}