AtCoder Regular Contest 148 B問題 dp
問題
提出解答
問題の概要
からなる文字列 に対して, で を 度回転させた文字列とする.
からなる長さ の文字列 に対して, 以下の操作を高々 回行うことができる.
- なる整数の組 を一つ選び, を に置き換える.
最終的な としてあり得る文字列のうち, 辞書式最小を求めよ.
制約
- は からなる長さ の文字列
解法
が 個の からなっている場合は明らかに操作しない方がよい.
よって, 以降では に が含まれているとする. を一番最初に現れる の添字番号とする. このとき, 以下の事がわかる.
- 操作をすべきである.
- 最小にする操作において, が成り立つ.
(証明)
また, 次のことも成り立つ.
最小にする操作のうち, であるものが存在する.
(証明)
で最小になる操作が存在したとする. このとき, の定め方から, の 文字目から 文字目までは全て である. また, とした場合の結果を考慮することにより, の末尾 文字は全て でなくてはならない. よって, とした (両端を 文字文だけ操作範囲を縮める) 場合と の場合の操作の結果が同じである. よって, とした場合でも最小値を求められることが分かった.
よって, とした場合のみを調べればよく, 1回の操作における検証が 時間であるので, 全体でも 時間で求められることができた.
なお, 最小値を取る において, であることもわかる.