はまやんはまやんはまやん

hamayanhamayan's blog

競技プログラミングにおける文字列アルゴリズム問題まとめ [ローリングハッシュ,Suffix Array,LCP,KMP,Aho-Corasick,Z-algorithm,Palindromic Tree, Manacher, Suffix Tree]

文字列アルゴリズム

  • Suffix Array
    • 接尾辞配列
    • 全文探索、パターンマッチングに使える
  • LCP
    • ある2つの文字列について接頭語がどれだけ一致しているか
    • 複数文字列があるとき、ある任意の2つのLCPを求めたい場合は、「1.文字列を昇順ソート」「2.隣り合う文字列でLCPを計算」「3.ある任意の2つの間のLCPの中で最小のLCPがその2つの文字列のLCP」参考
  • Trie, Aho-Corasick
    • Trie : 複数文字列から作った木
    • Aho-Corasick法 : 複数文字列のマッチングアルゴリズム 資料
    • Aho-Corasick法で作った木に対してDPする典型がある
  • Z-algorithm
    • z[i] := S[0..]とS[i..]の文字列での共通文字数
    • O(N)で構築できる
    • 覚書
    • 動的に作れるみたい 問題 実装?
  • Palindromic Tree, eertree
    • 回文にまつわる色々なことができる木
    • 数え上げ問題に使える。(最大最小でも使える?)
    • 参考1 参考2 参考3
  • Suffix Automaton
  • Manacher
    • 参考
    • A[i] := i番目を中心としたときの最長回分の半径。半径とは(全長+1)/2のこと
    • O(|S|)

問題

SuffixArray,LCP

(未解決)
https://kimiyuki.net/categories/suffix-array/
http://kenkoooo.hatenablog.com/entry/2016/11/17/201707
http://www.prefield.com/algorithm/string/suffix_array.html
 
KMP,Aho-Corasick

KMP法で最短周期を取得する問題

Trie

Trie上でのdfs

Aho-Corasickで作った木上でのDP

Palindromic Tree

Manacher

Suffix Tree

z-algorithm