Pagini recente » Cod sursa (job #2968625) | Cod sursa (job #744981) | Cod sursa (job #3207006) | Cod sursa (job #352874) | Cod sursa (job #2774476)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
trie()
{
cuvinte = prefixe = 0;
for (int i = 0; i < 26; i++)
{
fiu[i] = nullptr;
}
}
int cuvinte, prefixe;
trie* fiu[26];
};
trie* radacina = new trie;
void adaugaCuvant(trie* nod, char cuvant[])
{
if (strlen(cuvant) == 0)
{
nod->cuvinte++;
return;
}
nod->prefixe++;
int index = cuvant[0] - 'a';
// daca nu exista un fiu, creeaza unul
if (nod->fiu[index] == nullptr)
{
nod->fiu[index] = new trie();
}
adaugaCuvant(nod->fiu[index], cuvant + 1);
}
bool stergeCuvant(trie* nod, char cuvant[])
{
if (strlen(cuvant) == 0)
{
nod->cuvinte--;
}
else
{
nod->prefixe--;
int index = cuvant[0] - 'a';
if (stergeCuvant(nod->fiu[index], cuvant + 1))
{
nod->fiu[index] = nullptr;
}
}
if (nod->cuvinte == 0 && nod->prefixe == 0 && nod != radacina)
{
delete nod;
return true;
}
return false;
}
int aparitiiCuvant(trie* nod, char cuvant[])
{
if (strlen(cuvant) == 0)
{
return nod->cuvinte;
}
int index = cuvant[0] - 'a';
return aparitiiCuvant(nod->fiu[index], cuvant + 1);
}
void maxPrefix(trie* nod, char cuvant[], int& ans)
{
int index = cuvant[0] - 'a';
if (nod->fiu[index] == nullptr)
{
return;
}
ans++;
maxPrefix(nod->fiu[index], cuvant + 1, ans);
}
int main()
{
int op;
char cuv[25];
while (fin >> op >> cuv)
{
if (op == 0)
{
// adauga o aparitie in lista
adaugaCuvant(radacina, cuv);
}
else if (op == 1)
{
// sterge o aparitie din lista
stergeCuvant(radacina, cuv);
}
else if (op == 2)
{
// nr de aparitii ale cuv
fout << aparitiiCuvant(radacina, cuv) << '\n';
}
else
{
// lungimea celui mai lung prefix comun al cuv cu oricare alt cuvant din lista
int ans = 0;
maxPrefix(radacina, cuv, ans);
fout << ans << '\n';
}
}
}
/*
*/