Cod sursa(job #3318382)

Utilizator vlad7654vladimir manescu vlad7654 Data 28 octombrie 2025 11:09:46
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct TRIE{
    struct Node{
        int apps, finish;
        vector<Node*> sons;
        Node():sons(26), apps(0), finish(0){}
        ~Node(){
            for(int i=0; i<26; i++){
                if(this->sons[i]!=nullptr){
                    delete this->sons[i];
                }
            }
        }
    };
    Node* trie=nullptr;
    Node* add(Node* p, const char* w){
        if(p==nullptr){
            p=new Node;
        }
        p->apps++;
        if(w[0]=='\0'){
            p->finish++;
        }else{
            p->sons[w[0]-'a']=add(p->sons[w[0]-'a'],w+1);
        }
        return p;
    }
    Node* eradicate(Node* p, const char* w){
        if(p==nullptr){
            return p;
        }

        if(w[0]=='\0'){
            p->finish--;
        }else{
            p->sons[w[0]-'a']=eradicate(p->sons[w[0]-'a'],w+1);
        }
        p->apps--;
        if(p->apps==0){
            delete p;
            p=nullptr;
        }
        return p;
    }
    int number_of_apps(Node* p, const char* w){
        if(p==nullptr){
            return 0;
        }
        if(w[0]=='\0'){
            return p->finish;
        }else{
            return number_of_apps(p->sons[w[0]-'a'], w+1);
        }
    }
    int length(Node* p, const char* w){
        if(p==nullptr or w[0]=='\0'){
            return 0;
        }
        if(p->sons[w[0]-'a']==nullptr){
            return 0;
        }else{
            return 1+length(p->sons[w[0]-'a'],w+1);
        }
    }
};
int main(){
    string s;
    int tip;
    TRIE ans;
    while(fin>>tip>>s){
        if(tip==0){
            ans.trie=ans.add(ans.trie, s.c_str());
        }else if(tip==1){
            ans.trie=ans.eradicate(ans.trie, s.c_str());
        }else if(tip==2){
            fout<<ans.number_of_apps(ans.trie, s.c_str())<<'\n';
        }else{
            fout<<ans.length(ans.trie, s.c_str())<<'\n';
        }
    }
}