fork download
  1. #include <iostream>
  2. #include <unordered_map>
  3. #include <vector>
  4. #include <string>
  5. #include <optional>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. /**
  11.  * @class Kamus
  12.  * @brief Sebuah kelas untuk menyimpan kata dan sinonimnya dengan hubungan dua arah.
  13.  * Divisualisasikan menggunakan tree di mana definisi sinonim adalah direct parent dan children dari suatu kata.
  14.  *
  15.  * Kunci dari children adalah sebuah kata, dan nilainya adalah array of string yang berisi sinonim atau child dari kata tersebut.
  16.  * Kunci dari parent adalah sebuah kata, dan nilainya adalah kata yang merupakan parent dari kata tersebut.
  17.  * Dengan demikian, kita dapat mengambil sinonim dari sebuah kata melalui parent dan children yang dimiliki oleh kata tersebut.
  18.  */
  19. class Kamus {
  20. private:
  21.  
  22. unordered_map<string, vector<string>> children;
  23. unordered_map<string, string> parent;
  24.  
  25.  
  26. public:
  27. void tambah(const string& kata, const vector<string>& sinonim) {
  28. for (const string& s : sinonim) {
  29. auto& list = children[kata];
  30. if (find(list.begin(), list.end(), s) == list.end()) {
  31. list.push_back(s);
  32. }
  33.  
  34. if (parent.find(s) == parent.end()) {
  35. parent[s] = kata;
  36. }
  37. }
  38.  
  39. if (children.find(kata) == children.end()) {
  40. children[kata] = {};
  41. }
  42. }
  43.  
  44. vector<string> ambilSinonim(const string& kata) {
  45. vector<string> result;
  46.  
  47. if (children.find(kata) == children.end() && parent.find(kata) == parent.end()) {
  48. return result; // Return empty if the word is not found
  49. }
  50.  
  51. if (children.find(kata) != children.end()) {
  52. result.insert(result.end(), children[kata].begin(), children[kata].end());
  53. }
  54.  
  55. if (parent.find(kata) != parent.end()) {
  56. result.push_back(parent[kata]);
  57. }
  58.  
  59. sort(result.begin(), result.end());
  60. return result;
  61. }
  62.  
  63. void cetakSinonim(const string& kata) {
  64. vector<string> sinonim = ambilSinonim(kata);
  65. cout << "Sinonim dari '" << kata << "': ";
  66. for (const string& s : sinonim) {
  67. cout << s << " ";
  68. }
  69. cout << endl;
  70. }
  71. };
  72.  
  73. int main() {
  74. Kamus kamus;
  75. kamus.tambah("big", {"large", "great"});
  76. kamus.tambah("big", {"huge", "fat"});
  77. kamus.tambah("huge", {"enormous", "gigantic"});
  78.  
  79. kamus.cetakSinonim("big");
  80. kamus.cetakSinonim("huge");
  81. kamus.cetakSinonim("gigantic");
  82. kamus.cetakSinonim("colossal");
  83. }
  84.  
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
Sinonim dari 'big': fat great huge large 
Sinonim dari 'huge': big enormous gigantic 
Sinonim dari 'gigantic': huge 
Sinonim dari 'colossal':