【ハッシュメニュー】> FINAL問題 ハッシュテーブルを使おう (paizaランク C 相当) [難易度: 1811 ±40]
※リンク先へ移動するためには[paiza]へのログインが必要です。
ハッシュテーブル (チェイン法) を作り、データ (整数値) の挿入クエリと検索クエリを処理してください。
ハッシュテーブルは要素数 100 の配列とし、配列の各要素にはデータのリストを格納することとします。なお、各要素の初期値は空リストとします。各リストには複数のデータが含まれる可能性がありますが、格納された順番にデータが並ぶように実装してください。
ハッシュ関数は、入力で与えられる整数 a, b を用いて H(x) = (a * x + b) % 100
とします。
クエリは、以下の形式で入力されます。
1 x
ハッシュテーブルにデータ x を格納してください。2 x
ハッシュテーブルにデータ x が格納されているかどうかを調べてください。格納されているなら Yes
と、格納されていないなら No
と出力してください。
すべてのクエリを処理したあと、ハッシュテーブルの状態を出力してください。
入力値(例)
17 13
10
1 1
1 2
1 3
1 4
1 5
2 4
2 7
2 2
2 1
2 6
出力値(例)
Yes
No
Yes
Yes
No
1
2
3
4
5
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php for ($i = 0; $i < 100; $i++) { $query[$i] = []; } list($a, $b) = explode(" ", trim(fgets(STDIN))); $q = trim(fgets(STDIN)); for ($i = 0; $i < $q; $i++) { list($k, $x) = explode(" ", trim(fgets(STDIN))); $hash = ($a * $x + $b) % 100; if ($k == 1) { array_push($query[$hash], $x); } elseif ($k == 2) { echo (in_array($x, $query[$hash])) ? "Yes" : "No"; echo "\n"; } } for ($i = 0; $i < 100; $i++) { if (empty($query[$i])) { echo "\n"; } else { echo implode(" ", $query[$i]). "\n"; } } ?> |
解説
問題文の解読に苦労しましたが、クエリの処理の後にハッシュテーブル(配列)を出力するという解答のようです。
クエリは「2 x」がYes、Noの出力なので、in_array()で検索して出力しました。
1 2 |
} elseif ($k == 2) { echo (in_array($x, $query[$hash])) ? "Yes" : "No"; |
そのあとに、配列を出力します。
配列は、クエリ「1 x」で処理したクエリを出力するのですが、
1 2 |
if ($k == 1) { array_push($query[$hash], $x); |
$hash = ($a * $x + $b) % 100;
このハッシュ計算をすると、
1 1 → 30
1 2 → 47
1 3 → 64
1 4 → 81
1 5 → 98
となるので、配列の$query[30]、$query[47]...とそれぞれの番号に$xを入れます。
YesNoの後に出力すると配列の空は改行になり30番まで空白でそのあと「1」が出力される...となります。分かりにくかったですw