Pagini recente » Cod sursa (job #2019648) | Cod sursa (job #613914) | Cod sursa (job #267956) | Cod sursa (job #572076) | Cod sursa (job #2774489)
#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[30];
while (fin >> op >> cuv)
{
if (op == 0)
{
// adauga o aparitie in lista
adaugaCuvant(radacina, cuv);
}
else if (op == 1)
{
continue;
// sterge o aparitie din lista
stergeCuvant(radacina, cuv);
}
else if (op == 2)
{
continue;
// nr de aparitii ale cuv
fout << aparitiiCuvant(radacina, cuv) << '\n';
}
else
{
continue;
// lungimea celui mai lung prefix comun al cuv cu oricare alt cuvant din lista
int ans = 0;
maxPrefix(radacina, cuv, ans);
fout << ans << '\n';
}
}
}
/*
*/