#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
class Kamus
{
private:
map<string, vector<string>> kamus;
void addUnique(vector<string>& kamus, string val)
{
if (find (kamus.begin(), kamus.end(), val) == kamus.end())
{
kamus.push_back(val);
}
}
public:
void tambah(string kata, vector<string> sinonim)
{
if (kamus.find(kata) == kamus.end())
{
kamus[kata] = vector<string>(); // Add new kamus if there's no existing main key
}
for (string s: sinonim)
{
// Add the synonym to the main word map
addUnique(kamus[kata], s);
// Add bidirectional links
addUnique(kamus[s], kata);
}
}
vector<string>* ambilSinonim(string kata)
{
auto it = kamus.find(kata);
if (it == kamus.end())
{
return nullptr;
}
return &(it->second);
}
};
string printVec(vector<string>* strings)
{
if (strings == nullptr)
{
return "nullptr";
}
string out {"["};
for (int i = 0; i < strings->size(); i++)
{
out.append((*strings)[i]);
if (i < strings->size() - 1)
{
out.append(1, ',').append(1, ' ');
}
}
out.append(1, ']');
return out;
}
int main() {
Kamus kamus;
kamus.tambah("big", {"large", "great"});
kamus.tambah("big", {"huge", "fat"});
kamus.tambah("huge", {"enormous", "gigantic"});
cout << "Sinonim \"big\": " << printVec(kamus.ambilSinonim("big")) << endl;
cout << "Sinonim \"huge\": " << printVec(kamus.ambilSinonim("huge")) << endl;
cout << "Sinonim \"gigantic\": " << printVec(kamus.ambilSinonim("gigantic")) << endl;
cout << "Sinonim \"colossal\": " << printVec(kamus.ambilSinonim("colossal")) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEthbXVzCnsKcHJpdmF0ZToKCW1hcDxzdHJpbmcsIHZlY3RvcjxzdHJpbmc+PiBrYW11czsKCQoJdm9pZCBhZGRVbmlxdWUodmVjdG9yPHN0cmluZz4mIGthbXVzLCBzdHJpbmcgdmFsKQoJewoJCWlmIChmaW5kIChrYW11cy5iZWdpbigpLCBrYW11cy5lbmQoKSwgdmFsKSA9PSBrYW11cy5lbmQoKSkKCQl7CgkJCWthbXVzLnB1c2hfYmFjayh2YWwpOwkKCQl9Cgl9CgkKCQpwdWJsaWM6Cgl2b2lkIHRhbWJhaChzdHJpbmcga2F0YSwgdmVjdG9yPHN0cmluZz4gc2lub25pbSkKCXsKCQlpZiAoa2FtdXMuZmluZChrYXRhKSA9PSBrYW11cy5lbmQoKSkKCQl7CgkJCWthbXVzW2thdGFdID0gdmVjdG9yPHN0cmluZz4oKTsgLy8gQWRkIG5ldyBrYW11cyBpZiB0aGVyZSdzIG5vIGV4aXN0aW5nIG1haW4ga2V5CgkJfQoJCQoJCWZvciAoc3RyaW5nIHM6IHNpbm9uaW0pCgkJewoJCQkvLyBBZGQgdGhlIHN5bm9ueW0gdG8gdGhlIG1haW4gd29yZCBtYXAKCQkJYWRkVW5pcXVlKGthbXVzW2thdGFdLCBzKTsKCQkJCgkJCS8vIEFkZCBiaWRpcmVjdGlvbmFsIGxpbmtzCgkJCWFkZFVuaXF1ZShrYW11c1tzXSwga2F0YSk7CgkJfQoJfQoJCgl2ZWN0b3I8c3RyaW5nPiogYW1iaWxTaW5vbmltKHN0cmluZyBrYXRhKQoJewoJCWF1dG8gaXQgPSBrYW11cy5maW5kKGthdGEpOwoJCWlmIChpdCA9PSBrYW11cy5lbmQoKSkKCQl7CgkJCXJldHVybiBudWxscHRyOwoJCX0KCQlyZXR1cm4gJihpdC0+c2Vjb25kKTsKCX0KfTsKCgpzdHJpbmcgcHJpbnRWZWModmVjdG9yPHN0cmluZz4qIHN0cmluZ3MpCnsKCWlmIChzdHJpbmdzID09IG51bGxwdHIpCgl7CgkJcmV0dXJuICJudWxscHRyIjsKCX0KCQoJc3RyaW5nIG91dCB7IlsifTsKCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy0+c2l6ZSgpOyBpKyspCgl7CgkJb3V0LmFwcGVuZCgoKnN0cmluZ3MpW2ldKTsKCQlpZiAoaSA8IHN0cmluZ3MtPnNpemUoKSAtIDEpCgkJewoJCQlvdXQuYXBwZW5kKDEsICcsJykuYXBwZW5kKDEsICcgJyk7CgkJfQoJfQoJb3V0LmFwcGVuZCgxLCAnXScpOwoJCglyZXR1cm4gb3V0Owp9CgppbnQgbWFpbigpIHsKCUthbXVzIGthbXVzOwoJa2FtdXMudGFtYmFoKCJiaWciLCB7ImxhcmdlIiwgImdyZWF0In0pOwoJa2FtdXMudGFtYmFoKCJiaWciLCB7Imh1Z2UiLCAiZmF0In0pOwoJa2FtdXMudGFtYmFoKCJodWdlIiwgeyJlbm9ybW91cyIsICJnaWdhbnRpYyJ9KTsKCQoJY291dCA8PCAiU2lub25pbSBcImJpZ1wiOiAiIDw8IHByaW50VmVjKGthbXVzLmFtYmlsU2lub25pbSgiYmlnIikpIDw8IGVuZGw7CgkKCWNvdXQgPDwgIlNpbm9uaW0gXCJodWdlXCI6ICIgPDwgcHJpbnRWZWMoa2FtdXMuYW1iaWxTaW5vbmltKCJodWdlIikpIDw8IGVuZGw7CgkKCWNvdXQgPDwgIlNpbm9uaW0gXCJnaWdhbnRpY1wiOiAiIDw8IHByaW50VmVjKGthbXVzLmFtYmlsU2lub25pbSgiZ2lnYW50aWMiKSkgPDwgZW5kbDsKCQoJY291dCA8PCAiU2lub25pbSBcImNvbG9zc2FsXCI6ICIgPDwgcHJpbnRWZWMoa2FtdXMuYW1iaWxTaW5vbmltKCJjb2xvc3NhbCIpKSA8PCBlbmRsOwoJCglyZXR1cm4gMDsKfQo=