Cod sursa(job #3293463)

Utilizator Dia3141Costea Diana Stefania Dia3141 Data 11 aprilie 2025 18:54:26
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#define nmax (int)(1e5+1)
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
int task,sol;
string s;
struct nod{
    int prefix,cuv;
    nod* fr[26];
    nod(){
        prefix=cuv=0;
        for(int i=0;i<26;i++)
            fr[i]=0;
    }
};
nod* n=new nod;
void add(nod* n,int i){
    (*n).prefix++;
    if(s[i]==0){
        (*n).cuv++;
        return ;
    }
    if((*n).fr[s[i]-'a']==0)
        (*n).fr[s[i]-'a']=new nod;
    add((*n).fr[s[i]-'a'],i+1);
}
void cut(nod* n,int i){
    (*n).prefix--;
    if(s[i]==0){
        (*n).cuv--;
        return ;
    }
    cut((*n).fr[s[i]-'a'],i+1);
}
int get_number(nod* n,int i){
    if(s[i]==0)
        return (*n).cuv;
    if((*n).fr[s[i]-'a']==0)
        return 0;
    return get_number((*n).fr[s[i]-'a'],i+1);
}
int pref_max(nod* n,int i){
    if((*n).prefix<=0)
        return max(0,i-1);
    if(s[i]==0)
        return i;
    if((*n).fr[s[i]-'a']==0)
        return i;
    return pref_max((*n).fr[s[i]-'a'],i+1);
}
int main()
{
    while(cin>>task>>s){
        if(task==0)
            add(n,0);
        else if(task==1)
            cut(n,0);
        else if(task==2)
            cout<<get_number(n,0)<<'\n';
        else
            cout<<pref_max(n,0)<<'\n';
    }
    return 0;
}