Cod sursa(job #3265962)

Utilizator TraianQTraianQ TraianQ Data 4 ianuarie 2025 15:02:26
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <iostream>
#include <fstream>
using namespace std;
struct Cuvinte
{
    int fr_p = 0;
    int fr = 0;
    Cuvinte* urm[26];
    Cuvinte()
    {
        for (int i = 0; i < 26; i++)
            urm[i] = NULL;
    }
};
string cuv;
int points_added;
void increase(int depth, Cuvinte* pos)
{
    for (int i = 0; i < cuv.size(); i++)
    {
        int alph = cuv[i] - 'a';
        if (pos->urm[alph] == NULL)
            pos->urm[alph] = new Cuvinte;
        pos = pos->urm[alph];
        pos->fr_p += points_added;
    }
    pos->fr += points_added;
}
int Search(int depth, Cuvinte* pos, int frecv_word_or_longest_prefix)
{
    for (int i = 0; i < cuv.size(); i++)
    {
        int alph = cuv[i] - 'a';
        if (pos->urm[alph] == NULL || pos->urm[alph]->fr_p == 0)
        {
            if (frecv_word_or_longest_prefix == 1)
                return 0;
            return i;
        }
        pos = pos->urm[alph];
    }
    if (frecv_word_or_longest_prefix == 1)
        return pos->fr;
    else
        return cuv.size();
}
Cuvinte* startNod = new Cuvinte;
int main()
{
    /*
        0 w - adauga o aparitie a cuvantului w in lista
        1 w - sterge o aparitie a cuvantului w din lista
        2 w - tipareste numarul de aparitii ale cuvantului w in lista
        3 w - tipareste lungimea celui mai lung prefix comun al lui w cu oricare cuvant din lista
    */
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    int cer;
    while (fin >> cer >> cuv)
    {
        if (cer == 0)
        {
            points_added = 1;
            increase(0, startNod);
        }
        else if (cer == 1)
        {
            points_added = -1;
            increase(0, startNod);
        }
        else if (cer == 2)
        {
            fout << Search(0, startNod, 1) << '\n';
        }
        else
        {
            fout << Search(0, startNod, 2) << '\n';
        }
    }
    return 0;
}