#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;
}
