Cod sursa(job #2876821)

Utilizator mateitudordmDumitru Matei mateitudordm Data 23 martie 2022 17:39:48
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>

using namespace std;

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

string s;
int aux;
struct trie
{
    int cnt, fin;
    trie* fii[27];
    trie()
    {
        cnt = fin = 0;
        for (aux = 1; aux <= 27; aux++)
            fii[aux] = 0;
    };
};
trie *tr = new trie;
void modif (trie *x, int poz, int pmax, int val)
{
    x->cnt += val;
    if (poz <= pmax)
    {
        int ch = s[poz] - 'a' + 1;
        if (x->fii[ch] == 0)
            x->fii[ch] = new trie;
        modif (x->fii[ch], poz + 1, pmax, val);
    }
    else
        x->fin += val;
}
int nraparitii (trie *x, int poz, int pmax)
{
    if (poz <= pmax)
    {
        char ch = s[poz] - 'a' + 1;
        if (x->fii[ch] == 0 || x->fii[ch]->cnt == 0)
            return 0;
        return nraparitii (x->fii[ch], poz + 1, pmax);
    }
    else
        return x->fin;
}
int prefix (trie *x, int poz, int pmax)
{
    if (poz <= pmax)
    {
        char ch = s[poz] - 'a' + 1;
        if (x->fii[ch] == 0 || x->fii[ch]->cnt == 0)
            return poz;
        return prefix (x->fii[ch], poz + 1, pmax);
    }
    else
        return poz;
}

int main()
{
    int t;
    while (cin >> t)
    {
        cin >> s;
        if (t == 0)
            modif (tr, 0, s.size() - 1, 1);
        if (t == 1)
            modif (tr, 0, s.size() - 1, -1);
        else if (t == 2)
            cout << nraparitii (tr, 0, s.size() - 1) << '\n';
        else if (t == 3)
            cout << prefix (tr, 0, s.size() - 1) << '\n';
    }
    return 0;
}