Pagini recente » Cod sursa (job #3268574) | Cod sursa (job #3270807) | Cod sursa (job #3265962)
#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;
}