Rolling Hash
April 17, 2020
ローリングハッシュ
文字列を効率的にハッシュする手法。ある文字列Sに文字列Tが何個含まれているかを数える、文字列TのS内での位置を調べる場合などに使われる。 アルゴリズムは単純で、累積和の考えに近い。
参考
実装は以下を参考にした。
- http://algoogle.hadrori.jp/algorithm/rolling-hash.html
- https://ei1333.github.io/luzhiled/snippets/string/rolling-hash.html
-
https://qiita.com/keymoon/items/11fac5627672a6d6a9f6
- 衝突を起こさないようにするために、どのようにmodと基数を選ぶべきかにおいて大変参考になった
-
https://www.slideshare.net/nagisaeto/rolling-hash-149990902
- 適当にローリングハッシュを実装すると、簡単に衝突を起こせるという話
問題
- https://atcoder.jp/contests/abc141/tasks/abc141_e
- http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_14_B&lang=jp
実装
templateを使っているが、modはを前提とする。 基数は実行時に、文字集合より大きな数をランダムに選んで初期化する。衝突が起こる場合は、基数を複数用意して対処する。