Cod sursa(job #3337807)

Utilizator alexdraguAlexandru Dragu alexdragu Data 30 ianuarie 2026 09:30:37
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int tip;string s;
struct trie
{
    int child,cnt;
    trie* v[30];

    trie() {
        child=cnt=0;
        for(int i=0; i<30; i++) v[i]=nullptr;
    }
};

trie* root = new trie();

void add(int i,string& s,trie* node)
{
    if(i==s.size())
    {
        node->cnt++;
        return;
    }
    int ind=s[i]-'a'+1;
    if(!node->v[ind])
    {
        node->child++;
        node->v[ind]=new trie;
    }
    add(i+1,s,node->v[ind]);
}
bool check(trie* node)
{
    return (!node->cnt && !node->child && node!=root);
}
bool del(int i,string& s,trie* node)
{
    if(i==s.size())
    {
        if(node->cnt) node->cnt--;
        if(check(node))
        {
            delete node;
            return true;
        }
        return false;
    }
    int ind=s[i]-'a'+1;
    if(del(i+1,s,node->v[ind]))
    {
        node->child--;
        node->v[ind]=nullptr;
    }
    if(check(node))
    {
        delete node;
        return true;
    }
    return false;
}
int num(int i,string& s,trie* node)
{
    if(i==s.size()) return node->cnt;
    int ind=s[i]-'a'+1;
    if(!node->v[ind]) return 0;
    return num(i+1,s,node->v[ind]);
}
int pref(int i,string& s,trie* node)
{
    if(i==s.size()) return i;
    int ind=s[i]-'a'+1;
    if(!node->v[ind]) return i;
    return pref(i+1,s,node->v[ind]);
}
int main()
{
    while(fin>>tip>>s)
    {
        //fout<<tip<<" "<<s<<endl;
        if(tip==0) add(0,s,root);
        else if(tip==1) del(0,s,root);
        else if(tip==2) fout<<num(0,s,root)<<'\n';
        else fout<<pref(0,s,root)<<'\n';
    }
    return 0;
}