公式

C - Permutation of Length 26 解説 by Forested


\(R\neq|S|\) のとき最善ではありません。\(R=|S|\) として良いです。最適な \(L\) を求めることを考えます。\(S\)\(i\) 文字目以降の部分を取り出してできる文字列を \(T_i\) と書くことにします。

\(i\) について、\((L,R)=(i,|S|)\) のときの最適な \(p\) を計算しておきます。これは \(O(\sigma|S|)\) 時間で計算できます。さらに、\(S_i\) をその \(p\) で変換した文字列を \(T'_i\) と書くことにします。

\(T_L\) を順列で変換したときに辞書順最大となる \(L\) を計算したいのでした。\(i,j\) に対し、\(T'_i\)\(T'_j\) の大小関係を高速に計算できれば良いです。これの代わりに、\(T'_i\)\(T'_j\) の LCP の長さを計算できれば良いです。以降これを高速に計算することを目標にします。

文字 \(c\) について長さ \(|S|\) の文字列 \(A_c\) を次のように定めます。

  • \(A_c\)\(i\) 文字目は、\(S\)\(i\) 文字目が \(c\) ならば 1、そうでないならば 0

\(A_c\)\(c\) の昇順に結合したものを \(B\) とします。

\(T'_i\)\(T'_j\) の LCP は B 上の区間同士の LCP を \(\sigma\) 回計算することで計算できます。

以上で、この問題を \(O(\sigma|S|\log(\sigma|S|))\) 時間で解くことができます。

投稿日時:
最終更新: