Cod sursa(job #3308552)

Utilizator aaagabiTurbinca Gabriel aaagabi Data 26 august 2025 00:49:35
Problema Trie Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.62 kb
#include <bits/stdc++.h>

//#pragma GCC target("avx2")
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//#pragma GCC optimize("O3")
//#pragma GCC optimize("Ofast")
//using namespace __gnu_pbds;
using namespace std;
//ofstream fout("date.out");
ifstream fin("trie.in");
ofstream fout("trie.out");
//template <class T>
//using Tree =
//    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef long double ld;
int n;
int op;
int tr(char x)
{
    return x-'a';
}
struct node
{
    char val;
    int cnt;
    int nrf;
    //bool isleaf;
    node * next[26];
    node * fa;
    node()
    {
        for(int i=0;i<26;i++)
            next[i]=NULL;
        fa=NULL;
        cnt=0;
        //isleaf =false;
        nrf=0;
    }
};
node * root=new node;
void insertst(string s)
{
    node * nod=root;
    for(int i=0;i<s.size();i++)
    {
        char c=s[i];
        int nr=tr(c);
        nod->nrf++;
        if(nod->next[nr]==NULL)
            nod->next[nr]=new node;
        nod->next[nr]->fa=nod;
        nod=nod->next[nr];
    }
    nod->cnt++;
    //nod->isleaf=true;
}
void delst(string s)
{
    node *nod =root;
    for(int i=0;i<s.size();i++)
    {
        char c=s[i];
        int nr=tr(c);
        nod->nrf--;
        nod=nod->next[nr];
    }
    nod->cnt--;
    int ln=s.size()-1;
    if(nod->cnt==0)
    {
        while(nod->nrf==0&&nod!=root&&nod->cnt==0)
        {
            node * aux=nod;
            nod=nod->fa;
            delete aux;
            nod->next[tr(s[ln])]=NULL;
        }
    }
}
void printst(string s)
{
    node *nod=root;
    for(int i=0;i<s.size();i++)
    {
        char c=s[i];
        int nr=tr(c);
        if(nod->next[nr]==NULL)
        {
            fout<<"0\n";
            return;
        }
        nod=nod->next[nr];
    }
    fout<<nod->cnt<<'\n';
}
void printpref(string s)
{
    node * nod=root;
    for(int i=0;i<s.size();i++)
    {
        char c=s[i];
        int nr=tr(c);
        if(nod->next[nr]==NULL)
        {
            fout<<i<<'\n';
            return;
        }
        nod=nod->next[nr];
    }
    fout<<s.size()<<'\n';
}
void solve()
{
    string s;
    fin>>s;
    if(op==0)
        insertst(s);
    if(op==1)
        delst(s);
    if(op==2)
        printst(s);
    if(op==3)
        printpref(s);
}

int main()
{
    cin.tie(0)->sync_with_stdio(0);
    int t=1;
    //fin>>t;
    //int op;
    while(fin>>op)
        solve();
    return 0;
}