Cod sursa(job #3238669)

Utilizator adelinapetreAdelina Petre adelinapetre Data 28 iulie 2024 18:17:13
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include <fstream>
using namespace std;

ifstream cin("trie.in");
ofstream cout("trie.out");

struct TRIE
{
    struct Nod
    {
        Nod* copil[26];
        int nrfii = 0, nrcuv = 0, sfarsit = 0;
        Nod()
        {
            nrfii = nrcuv = sfarsit = 0;
            for(int i = 0; i < 26; i ++)
                copil[i] = NULL;
        }
    };
    Nod* radacina = new Nod();

    void insert(string s, int poz, Nod* nod)
    {
        if(poz == s.size())
        {
            nod -> nrcuv ++;
            return;
        }
        int lit = s[poz] - 'a';
        if(nod -> copil[lit] == NULL)
            nod -> copil[lit] = new Nod();
        nod = nod->copil[lit];
        nod -> nrfii ++;
        insert(s, poz + 1, nod);
    }

    void erase(string s, int poz, Nod* nod)
    {
        if(poz == s.size())
        {
            nod -> nrfii --;
            nod -> nrcuv --;
            return;
        }
        int lit = s[poz] - 'a';
        nod -> nrfii --;
        nod = nod -> copil[lit];
        erase(s, poz + 1, nod);
    }

    int count(string s, int poz, Nod* nod)
    {
        for (int i = 0; i < s.size(); i ++)
        {
            int lit = s[i] - 'a';
            if(nod -> copil[lit] == NULL)
                return 0;
            nod = nod -> copil[lit];
        }
        return nod -> nrcuv;
    }

    int longest_prefix(string s, int poz, Nod* nod)
    {
        if(poz == s.size())
            return 0;
        int lit = s[poz] - 'a';
        if(nod -> copil[lit] == NULL || nod -> copil[lit] -> nrfii == 0)
            return 0;
        return 1 + longest_prefix(s, poz + 1, nod -> copil[lit]);
    }

} trie;
int main()
{
    int t;
    string s;
    while(cin >> t >> s)
    {
        if(t == 0)//adun
            trie.insert(s, 0, trie.radacina);
        else if (t == 1)//scad
            trie.erase(s, 0, trie.radacina);
        else if (t == 2)//de cate ori apare
            cout << trie.count(s, 0, trie.radacina) << '\n';
        else
            cout << trie.longest_prefix(s, 0, trie.radacina) << '\n';
    }
    return 0;
}