Cod sursa(job #3307472)

Utilizator iordacheMatei Iordache iordache Data 21 august 2025 11:00:36
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
#define pb push_back
#define int long long
using namespace std;
const int N=2e5+5;
struct Node
{
    Node *g[26];
    int cnt=0,ends=0;
    Node() {for(int i=0;i<26;++i) g[i]=NULL;}
};
Node *root=new Node;
void add(Node *&node, string s, int dep=-1)
{
    if(dep==s.size()-1) {node->ends++;return;}
    if(node->g[s[dep+1]-'a']==NULL) node->g[s[dep+1]-'a']=new Node;
    node->g[s[dep+1]-'a']->cnt++;
    add(node->g[s[dep+1]-'a'],s,dep+1);
}
void del(Node *&node, string s, int dep=-1)
{
    if(dep==s.size()-1) {node->ends--;node->cnt--;if(node->cnt==0) delete node;return;}
    del(node->g[s[dep+1]-'a'],s,dep+1);
    if(node->g[s[dep+1]-'a']!=NULL&&node->g[s[dep+1]-'a']->cnt==0) node->g[s[dep+1]-'a']=NULL;
    if(dep==-1) return;
    node->cnt--;
    if(node->cnt==0) delete node;
}
int query(Node *node, string s, int dep=-1)
{
    if(node==NULL) return 0;
    if(dep==s.size()-1) return node->ends;
    return query(node->g[s[dep+1]-'a'],s,dep+1);
}
int pref(Node *node, string s, int dep=-1)
{
    if(node==NULL) return 0;
    if(dep==s.size()-1) return 0;
    return 1+pref(node->g[s[dep+1]-'a'],s,dep+1);
}
signed main()
{
    ifstream cin("trie.in");ofstream cout("trie.out");
    int op;string s;
    while(cin>>op)
    {
        cin>>s;
        if(op==0) add(root,s);
        else if(op==1) del(root,s);
        else if(op==2) cout<<query(root,s)<<'\n';
        else cout<<pref(root,s)-1<<'\n';
    }
}