Cod sursa(job #3285560)

Utilizator Dragos__1_1Dragos Antohi Dragos__1_1 Data 13 martie 2025 10:12:27
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int t,m,n,i,j,a,b;
struct nod{
    nod *son[26];
    int term=0;
    int cnt=0;
    nod (){
        for (int i=0;i<26;i++){
            son[i]=nullptr;
        }
    }
}*root;
void add(string s){
    nod *a=root;
    for (int i=0;i<s.size();i++){
        int ind=s[i]-'a';
        if(!a->son[ind]){
            a->son[ind]=new nod;
            a->son[ind]->cnt++;
        }
        else{
            a->son[ind]->cnt++;
        }
        a=a->son[ind];
    }
    a->term++;
}
void del(string s){
    nod *a=root;
    for (int i=0;i<s.size();i++){
        a=a->son[s[i]-'a'];
        a->cnt--;
        if (i==s.size()-1){
            a->term--;
        }
    }
}
int task2(string s){
    nod *a=root;
    for (i=0;i<s.size();i++){
        int ind=s[i]-'a';
        if (!a->son[ind]||a->son[ind]->cnt==0)return 0;
        a=a->son[ind];
    }
    return a->term;
}
int task3(string s){
    nod *a=root;
    for (i=0;i<s.size();i++){
        int ind=s[i]-'a';
        if (!a->son[ind]||a->son[ind]->cnt==0)return i;
        a=a->son[ind];
    }
    return i;
}
int main()
{   root= new nod;
    string s;
    while(f>>n>>s){
        if (n==0)add(s);
        if (n==1)del(s);
        if (n==2)g<<task2(s)<<'\n';
        if (n==3)g<<task3(s)<<'\n';
    }
    return 0;
}