AtCoder Beginner Contest 249 E問題 RLE
問題
提出解答
(※ 解説と動的計画法の添字の順番が逆になっている) atcoder.jp
問題の概要
文字列 に対して, 以下の方法で生成される文字列を *1 と書くことにする.
- を以下を満たすように連続する部分列で分割する.
- 各部分列にある文字は全て同じである. つまり, ただ1つの文字からなっている.
- 分割したとき, 各部分列は極大である.
- 各部分列において, が 個からなる文字列であるとき, その部分列を に置き換える (例: .
- 順序を保ちながら, 文字列を連結させる.
以下を全て満たす文字列 の数を で割った余りを求めよ.
- は英小文字からなる長さ の文字列
制約
- は素数
解法
動的計画法で解くことにする. に対して, を
- となる文字列 の数
とする. このとき, 最終解答は
である.
ベースケースは のときで,
である.
更新式について, 整数 の桁数を , 及び, 英小文字の種類数を としたとき, を求める際, の 文字目と何文字続いているかによって場合分けすることにより,
となる. なお, 計算のしやすさのために,
とおく. このとき, ] である.
を求める仮定について, の値で分けることにより, という制約から,
である ( または に対して, とする).
そして, の差分を見ると,
であるから, から高々 回の計算で が求められる. そして, のとき, である.
よって, 動的計画法の要素数が 個, 更新式は 時間なので, この問題を で求めることができた.
*1:Run Length Encoding の略