Cod sursa(job #3120983)

Utilizator Giulian617Buzatu Giulian Giulian617 Data 10 aprilie 2023 01:12:10
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
///Buzatu Giulian
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int op;
string s;
struct Node
{
    int apps=0,finish=0;///apps=appearances
    vector<Node*>sons;
    Node():sons(26) {}
    ~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 query_no_apps(Node* p,const char* w)
{
    if(p==nullptr)
        return 0;
    if(w[0]=='\0')
        return p->finish;
    else
        return query_no_apps(p->sons[w[0]-'a'],w+1);
}
int query_prefix(Node* p,const char* w)
{
    if(p==nullptr || w[0]=='\0')
        return 0;
    if(p->sons[w[0]-'a']==nullptr)
        return 0;
    else
        return 1+query_prefix(p->sons[w[0]-'a'],w+1);
}
int main()
{
    while(f>>op>>s)
    {
        if(op==0)
            trie=add(trie,s.c_str());
        else if(op==1)
            trie=eradicate(trie,s.c_str());
        else if(op==2)
            g<<query_no_apps(trie,s.c_str())<<'\n';
        else
            g<<query_prefix(trie,s.c_str())<<'\n';
    }
    delete trie;
    return 0;
}