問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
データのハッシュ値を添字として用い、データを表に格納するデータ構造をハッシュテーブルと呼びます。このデータ構造には、データの挿入や検索が O(1) でおこなえるという利点があります。
ハッシュテーブルの最もシンプルな実装は、以下のようなものです。
・ 前準備
ハッシュ関数と、配列を用意する (ハッシュ関数の出力の範囲が、配列の添字の範囲に収まるように)・ データの挿入
データのハッシュ値を計算し、その値を添字として配列にデータを格納する・ データの検索
データのハッシュ値を計算し、その添字の位置にデータがあるかどうかを調べる
・ オープンアドレス法
衝突が解消されるまで、ハッシュ値を再計算して更新・ チェイン法
配列の要素をデータそのものではなくデータのリストとする。衝突した複数のデータを同じ場所に格納する
オープンアドレス法
を採用したハッシュテーブルを実装して、各クエリを処理してください。-1
とします。H(p) = (d の 1 文字目の文字コード * B1 + d の 2 文字目の文字コード * B2 + ... + d の m 文字目の文字コード * Bm) % mod
H(p) ← (H(p) + 1) % mod
による更新をおこなってください。1 d
ハッシュテーブルにデータ d を格納してください。
2 d
ハッシュテーブルにデータ d が格納されているかどうかを調べてください。
格納されているならデータ d がハッシュテーブルの先頭から何番目かを出力してください。
格納していないなら-1
と出力してください。
ただし、ハッシュテーブルの先頭のデータを 1 番目とします。
Q
q_1
q_2
...
q_Q
1 d_i
2 d_i
クエリに従って出力をおこなってください。ハッシュテーブルの添え字と出力する番号に 1 の差があることに注意してください。
すべてのテストケースにおいて、以下の条件をみたします。
1 d_i
によってハッシュテーブルに d_i が格納されるとき、既に d_i がハッシュテーブルに存在していることはありません。5
1 japan
1 r
2 japan
2 r
2 tokyo
659
660
-1
10
2 2GzW
1 zUM
2 8I8m6
2 zUM
2 v9J6k
1 UZ6
1 dew
1 UStXG
1 w05kr
1 d
-1
-1
321
-1