Cod sursa(job #3274750)

Utilizator Bolfa_DBolfa Diana Bolfa_D Data 8 februarie 2025 10:48:22
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
class Trie{
    int cnt=0, lf=0;
    Trie *next[27]={};
    public:
    void insert(int i, char s[])
    {
        ++lf;
        if(i==strlen(s))
            cnt++;
        else
        {
            if(!next[s[i]-'a'])
                next[s[i]-'a']=new Trie;
            next[s[i]-'a']->insert(i+1, s);
        }
    }
    void erase(int i, char s[])
    {
        --lf;
        if(i==strlen(s))
            --cnt;
        else
        {
            next[s[i]-'a']->erase(i+1, s);
            if(!next[s[i]-'a']->lf)
            {
                delete next[s[i]-'a'];
                next[s[i]-'a']=nullptr;
            }
        }
    }
    int fr(int i, char s[])
    {
        if(i==strlen(s))
            return cnt;
        if(!next[s[i]-'a'])
            return 0;
        return next[s[i]-'a']->fr(i+1, s);
    }

    int prefix(int i, char s[])
    {
        if(i==strlen(s))
            return 0;
        if(!next[s[i]-'a'])
            return 0;
        return 1+next[s[i]-'a']->prefix(i+1, s);

    }
};
Trie a;
int c;
char s[22];
int main()
{
    while(fin>>c>>s)
    {
        if(c==0)
            a.insert(0,s);
        if(c==1)
            a.erase(0,s);
        if(c==2)
            fout<<a.fr(0, s)<<'\n';
        if(c==3)
            fout<<a.prefix(0,s)<<'\n';
    }
    return 0;
}