#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <sstream>
#include <algorithm>
#include <cctype>
using namespace std;
class Kamus {
private:
map<string, vector<string> > data;
void tambahSatu(const string& kata, const string& sin) {
if (kata == sin) return;
vector<string>& daftar = data[kata];
if (find(daftar.begin(), daftar.end(), sin) == daftar.end()) {
daftar.push_back(sin);
}
}
public:
void tambah(string kata, vector<string> sinonim) {
for (size_t i = 0; i < sinonim.size(); i++) {
tambahSatu(kata, sinonim[i]);
tambahSatu(sinonim[i], kata);
}
}
vector<string> ambilSinonim(string kata) {
map<string, vector<string> >::iterator it = data.find(kata);
if (it == data.end()) return vector<string>();
return it->second;
}
};
string keHurufKecil(string s) {
transform(s.begin(), s.end(), s.begin(),
[](unsigned char c) { return tolower(c); });
return s;
}
vector<string> pecahKata(string baris) {
replace(baris.begin(), baris.end(), ',', ' ');
istringstream iss(baris);
vector<string> hasil;
string token;
while (iss >> token) hasil.push_back(keHurufKecil(token));
return hasil;
}
bool bacaKata(const string& prompt, string& kata) {
string baris;
cout << prompt;
if (!getline(cin, baris)) return false;
vector<string> k = pecahKata(baris);
kata = k.empty() ? "" : k[0];
return true;
}
void cetak(const string& kata, const vector<string>& hasil) {
cout << "Sinonim '" << kata << "': ";
if (hasil.empty()) {
cout << "null" << endl;
return;
}
cout << "[";
for (size_t i = 0; i < hasil.size(); i++) {
cout << "'" << hasil[i] << "'";
if (i + 1 < hasil.size()) cout << ", ";
}
cout << "]" << endl;
}
void tampilMenu() {
cout << "\n=== KAMUS SINONIM ===" << endl;
cout << "1. Tambah kata dan sinonim" << endl;
cout << "2. Cari sinonim sebuah kata" << endl;
cout << "3. Keluar" << endl;
cout << "Pilih menu (1-3): ";
}
int main() {
Kamus kamus;
string pilihan;
while (true) {
tampilMenu();
if (!getline(cin, pilihan)) break;
if (pilihan == "1") {
string kata;
if (!bacaKata("Masukkan kata: ", kata)) break;
if (kata.empty()) {
cout << "Kata tidak boleh kosong." << endl;
continue;
}
string baris;
cout << "Masukkan sinonim (pisahkan dengan spasi atau koma): ";
if (!getline(cin, baris)) break;
vector<string> sinonim = pecahKata(baris);
if (sinonim.empty()) {
cout << "Minimal harus ada satu sinonim." << endl;
continue;
}
kamus.tambah(kata, sinonim);
cout << "Berhasil menambahkan " << sinonim.size()
<< " sinonim untuk '" << kata << "'." << endl;
} else if (pilihan == "2") {
string kata;
if (!bacaKata("Masukkan kata yang dicari: ", kata)) break;
if (kata.empty()) {
cout << "Kata tidak boleh kosong." << endl;
continue;
}
cetak(kata, kamus.ambilSinonim(kata));
} else if (pilihan == "3") {
cout << "Terima kasih, program selesai." << endl;
break;
} else {
cout << "Pilihan tidak valid, masukkan 1, 2, atau 3." << endl;
}
}
return 0;
}