#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
#include <optional>
#include <algorithm>
using namespace std;
/**
* @class Kamus
* @brief Sebuah kelas untuk menyimpan kata dan sinonimnya dengan hubungan dua arah.
* Divisualisasikan menggunakan tree di mana definisi sinonim adalah direct parent dan children dari suatu kata.
*
* Kunci dari children adalah sebuah kata, dan nilainya adalah array of string yang berisi sinonim atau child dari kata tersebut.
* Kunci dari parent adalah sebuah kata, dan nilainya adalah kata yang merupakan parent dari kata tersebut.
* Dengan demikian, kita dapat mengambil sinonim dari sebuah kata melalui parent dan children yang dimiliki oleh kata tersebut.
*/
class Kamus {
private:
unordered_map<string, vector<string>> children;
unordered_map<string, string> parent;
public:
void tambah(const string& kata, const vector<string>& sinonim) {
for (const string& s : sinonim) {
auto& list = children[kata];
if (find(list.begin(), list.end(), s) == list.end()) {
list.push_back(s);
}
if (parent.find(s) == parent.end()) {
parent[s] = kata;
}
}
if (children.find(kata) == children.end()) {
children[kata] = {};
}
}
vector<string> ambilSinonim(const string& kata) {
vector<string> result;
if (children.find(kata) == children.end() && parent.find(kata) == parent.end()) {
return result; // Return empty if the word is not found
}
if (children.find(kata) != children.end()) {
result.insert(result.end(), children[kata].begin(), children[kata].end());
}
if (parent.find(kata) != parent.end()) {
result.push_back(parent[kata]);
}
sort(result.begin(), result.end());
return result;
}
void cetakSinonim(const string& kata) {
vector<string> sinonim = ambilSinonim(kata);
cout << "Sinonim dari '" << kata << "': ";
for (const string& s : sinonim) {
cout << s << " ";
}
cout << endl;
}
};
int main() {
Kamus kamus;
kamus.tambah("big", {"large", "great"});
kamus.tambah("big", {"huge", "fat"});
kamus.tambah("huge", {"enormous", "gigantic"});
kamus.cetakSinonim("big");
kamus.cetakSinonim("huge");
kamus.cetakSinonim("gigantic");
kamus.cetakSinonim("colossal");
}