Cod sursa(job #3040353)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 29 martie 2023 19:44:30
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <fstream>
#include <string>

using namespace std;

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

struct trie{
    int fr, ctfii;
    trie * fii[26];
    trie()
    {
        ctfii = 0;
        fr = 0;
        for (int i = 0; i < 26; i++)
        {
            fii[i] = 0;
        }
    }
};

trie * t = new trie;
string s;
int sz;

void ins (trie * nod, int poz)
{
    if (poz == sz)
    {
        nod -> fr++;
        return;
    }
    int urm = (s[poz] - 'a');
    if (nod -> fii[urm] == 0)
    {
        nod -> ctfii++;
        nod -> fii[urm] = new trie;
    }
    ins(nod -> fii[urm], poz + 1);
}

bool del (trie * nod, int poz)
{
    if (poz == sz)
    {
        nod -> fr--;
    }
    else
    {
        int urm = (s[poz] - 'a');
        if (del(nod -> fii[urm], poz + 1))
        {
            nod -> fii[urm] = 0;
            nod -> ctfii--;
        }
    }
    if (nod -> fr == 0 && nod -> ctfii == 0)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int query (trie * nod, int poz)
{
    if (poz == sz)
    {
        return nod -> fr;
    }
    int urm = (s[poz] - 'a');
    if (nod -> fii[urm] != 0)
    {
        return query(nod -> fii[urm], poz + 1);
    }
    return 0;
}

int pref (trie * nod, int poz)
{
    if (sz == poz)
    {
        return poz;
    }
    int urm = (s[poz] - 'a');
    if (nod -> fii[urm] == 0)
    {
        return poz;
    }
    return pref(nod -> fii[urm], poz + 1);
}

int main ()
{
    int op;
    while (in >> op >> s)
    {
        sz = s.size();
        if (op == 0)
        {
            ins(t, 0);
        }
        if (op == 1)
        {
            del(t, 0);
        }
        if (op == 2)
        {
            out << query(t, 0) << '\n';
        }
        if (op == 3)
        {
            out << pref(t, 0) << '\n';
        }
    }
    in.close();
    out.close();
    return 0;
}