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