Cod sursa(job #2971811)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 28 ianuarie 2023 09:28:43
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Trie
{
    int e = 0,trec = 0;
    Trie *next[26] = {nullptr};

    void baga(string &s,int p = 0)
    {
        trec++;
        if(p == s.size())
            {
                e++;
                return;
            }

        if(!next[s[p] - 'a'])
            {
                Trie *nou = new Trie;
                next[s[p] - 'a'] = nou;
            }

        next[s[p] - 'a']->baga(s,p + 1);
    }

    int check(string &s,int p = 0)
    {
        if(p == s.size())
            return e;

        if(!next[s[p] - 'a'])
            return 0;

        return next[s[p] - 'a']->check(s,p + 1);
    }

    void sterge(string &s,int p = 0)
    {
        trec--;
        if(p == s.size())
            {
                e--;
                return;
            }

        if(!next[s[p] - 'a'])
            return;

        next[s[p] - 'a']->sterge(s,p + 1);
        if(!next[s[p] - 'a']->trec)
            {
                delete next[s[p] - 'a'];
                next[s[p] - 'a'] = nullptr;
            }
    }

    int lcp(string &s,int p = 0)
    {
        if(p == s.size())      return p;
        if(!next[s[p] - 'a'])  return p;
        return next[s[p] - 'a']->lcp(s,p + 1);
    }
};



int main()
{
    Trie *trie = new Trie;
    string s; int op;
    while(fin >> op >> s)
        {
            switch(op)
            {
                case 1: trie->sterge(s); break;
                case 2: fout << trie->check(s) << '\n'; break;
                case 3: fout << trie->lcp(s) << '\n'; break;
                case 0: trie->baga(s); break;
            }

        }
}