<?php
class Kamus
{
private $graph = [];
private $keys = [];
public function tambah
(string
$kata, array $sinonim): void
{
// Pastikan ada list untuk $kata
if (!isset($this->graph[$kata])) { $this->graph[$kata] = [];
}
// Tandai bahwa $kata pernah di‐tambah
$this->keys[$kata] = true;
foreach ($sinonim as $s) {
// Buat node untuk $s jika belum ada
if (!isset($this->graph[$s])) { $this->graph[$s] = [];
}
// Tambahkan $s ke daftar $kata, jika belum ada
if (!in_array($s, $this->graph[$kata], true)) { $this->graph[$kata][] = $s;
}
// Tambahkan $kata ke daftar $s, jika belum ada
if (!in_array($kata, $this->graph[$s], true)) { $this->graph[$s][] = $kata;
}
}
}
public function ambilSinonim(string $kata)
{
if (!isset($this->keys[$kata])) { return null;
}
return $this->graph[$kata];
}
}
$kamus = new Kamus();
// Kata: “gubris” (jarang dipakai), sinonim: abaikan, acuhkan
$kamus->tambah('gubris', ['abaikan', 'acuhkan']);
// Tambah lagi sinonim “mengabaikan” untuk “gubris”
$kamus->tambah('gubris', ['mengabaikan']);
// Kata “abaikan” juga ditambahkan sendiri dengan sinonim lain
$kamus->tambah('abaikan', ['mengesampingkan', 'menyampingkan']);
// Ambil sinonim “gubris”
print_r($kamus->ambilSinonim('gubris')); // Ambil sinonim “abaikan” (harus menyertakan “gubris” karena dua arah)
print_r($kamus->ambilSinonim('abaikan'));
// Kata yang hanya muncul sebagai sinonim, bukan kunci, mengembalikan null
var_dump($kamus->ambilSinonim('acuhkan')); // null var_dump($kamus->ambilSinonim('menyampingkan')); // null
PD9waHAKY2xhc3MgS2FtdXMKewogICAgcHJpdmF0ZSAkZ3JhcGggPSBbXTsKICAgIHByaXZhdGUgJGtleXMgPSBbXTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gdGFtYmFoKHN0cmluZyAka2F0YSwgYXJyYXkgJHNpbm9uaW0pOiB2b2lkCiAgICB7CiAgICAgICAgLy8gUGFzdGlrYW4gYWRhIGxpc3QgdW50dWsgJGthdGEKICAgICAgICBpZiAoIWlzc2V0KCR0aGlzLT5ncmFwaFska2F0YV0pKSB7CiAgICAgICAgICAgICR0aGlzLT5ncmFwaFska2F0YV0gPSBbXTsKICAgICAgICB9CiAgICAgICAgLy8gVGFuZGFpIGJhaHdhICRrYXRhIHBlcm5haCBkaeKAkHRhbWJhaAogICAgICAgICR0aGlzLT5rZXlzWyRrYXRhXSA9IHRydWU7CgogICAgICAgIGZvcmVhY2ggKCRzaW5vbmltIGFzICRzKSB7CiAgICAgICAgICAgIC8vIEJ1YXQgbm9kZSB1bnR1ayAkcyBqaWthIGJlbHVtIGFkYQogICAgICAgICAgICBpZiAoIWlzc2V0KCR0aGlzLT5ncmFwaFskc10pKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Z3JhcGhbJHNdID0gW107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRhbWJhaGthbiAkcyBrZSBkYWZ0YXIgJGthdGEsIGppa2EgYmVsdW0gYWRhCiAgICAgICAgICAgIGlmICghaW5fYXJyYXkoJHMsICR0aGlzLT5ncmFwaFska2F0YV0sIHRydWUpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Z3JhcGhbJGthdGFdW10gPSAkczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVGFtYmFoa2FuICRrYXRhIGtlIGRhZnRhciAkcywgamlrYSBiZWx1bSBhZGEKICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgka2F0YSwgJHRoaXMtPmdyYXBoWyRzXSwgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5ncmFwaFskc11bXSA9ICRrYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhbWJpbFNpbm9uaW0oc3RyaW5nICRrYXRhKQogICAgewogICAgICAgIGlmICghaXNzZXQoJHRoaXMtPmtleXNbJGthdGFdKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5ncmFwaFska2F0YV07CiAgICB9Cn0KCgoka2FtdXMgPSBuZXcgS2FtdXMoKTsKCi8vIEthdGE6IOKAnGd1YnJpc+KAnSAoamFyYW5nIGRpcGFrYWkpLCBzaW5vbmltOiBhYmFpa2FuLCBhY3Voa2FuCiRrYW11cy0+dGFtYmFoKCdndWJyaXMnLCBbJ2FiYWlrYW4nLCAnYWN1aGthbiddKTsKCi8vIFRhbWJhaCBsYWdpIHNpbm9uaW0g4oCcbWVuZ2FiYWlrYW7igJ0gdW50dWsg4oCcZ3Vicmlz4oCdCiRrYW11cy0+dGFtYmFoKCdndWJyaXMnLCBbJ21lbmdhYmFpa2FuJ10pOwoKLy8gS2F0YSDigJxhYmFpa2Fu4oCdIGp1Z2EgZGl0YW1iYWhrYW4gc2VuZGlyaSBkZW5nYW4gc2lub25pbSBsYWluCiRrYW11cy0+dGFtYmFoKCdhYmFpa2FuJywgWydtZW5nZXNhbXBpbmdrYW4nLCAnbWVueWFtcGluZ2thbiddKTsKCi8vIEFtYmlsIHNpbm9uaW0g4oCcZ3Vicmlz4oCdCnByaW50X3IoJGthbXVzLT5hbWJpbFNpbm9uaW0oJ2d1YnJpcycpKTsKLy8gQW1iaWwgc2lub25pbSDigJxhYmFpa2Fu4oCdIChoYXJ1cyBtZW55ZXJ0YWthbiDigJxndWJyaXPigJ0ga2FyZW5hIGR1YSBhcmFoKQpwcmludF9yKCRrYW11cy0+YW1iaWxTaW5vbmltKCdhYmFpa2FuJykpOwoKLy8gS2F0YSB5YW5nIGhhbnlhIG11bmN1bCBzZWJhZ2FpIHNpbm9uaW0sIGJ1a2FuIGt1bmNpLCBtZW5nZW1iYWxpa2FuIG51bGwKdmFyX2R1bXAoJGthbXVzLT5hbWJpbFNpbm9uaW0oJ2FjdWhrYW4nKSk7ICAgICAgICAgLy8gbnVsbAp2YXJfZHVtcCgka2FtdXMtPmFtYmlsU2lub25pbSgnbWVueWFtcGluZ2thbicpKTsgICAvLyBudWxsCg==