Cod sursa(job #3285842)

Utilizator tudor_costinCostin Tudor tudor_costin Data 13 martie 2025 15:11:13
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
    trie *lg[26];
    int nrfii,fr;
    trie()
    {
        for(int i=0; i<26; i++) lg[i]=nullptr;
        nrfii=0,fr=0;
    }
};
trie *rad=new trie;
void add(trie *nod,string& s,int pos)
{
    if(pos==s.size())
    {
        nod->fr++;
        return;
    }
    int ch=s[pos]-'a';
    if(!nod->lg[ch])
    {
        nod->lg[ch]=new trie;
        nod->nrfii++;
    }
    add(nod->lg[ch],s,pos+1);
}
bool del(trie *nod,string& s,int pos)
{
    if(pos==s.size())
    {
        nod->fr--;
    }
    else
    {
        int ch=s[pos]-'a';
        if(del(nod->lg[ch],s,pos+1))
        {
            nod->nrfii--;
            nod->lg[ch]=nullptr;
        }
    }
    if(nod->nrfii==0 && nod->fr==0 && nod!=rad)
    {
        delete nod;
        return true;
    }
    return false;
}
int app(trie *nod,string &s,int pos)
{
    if(pos==s.size())
    {
        return nod->fr;
    }
    int ch=s[pos]-'a';
    if(!nod->lg[ch]) return 0;
    else return app(nod->lg[ch],s,pos+1);
}
int pref(trie *nod,string &s,int pos)
{
    if(pos==s.size()) return pos;
    int ch=s[pos]-'a';
    if(!nod->lg[ch]) return pos;
    return pref(nod->lg[ch],s,pos+1);
}
int main()
{
    string s;
    int tip;
    while(fin>>tip>>s)
    {
        if(tip==0) add(rad,s,0);
        else if(tip==1) del(rad,s,0);
        else if(tip==2) fout<<app(rad,s,0)<<'\n';
        else fout<<pref(rad,s,0)<<'\n';
    }
    return 0;
}