AtCoder Regular Contest 156 A問題 Non-Adjacent Flip
問題
提出解答
問題の概要
からなる長さ の文字列 がある.
以下の操作を 回以上行うことによって, の全ての文字を にすることは可能か? 可能ならばその操作回数の最小値を求めよ.
- となる整数 を選び, それぞれについて, ならば へ, ならば に変更する.
個のテストケースについて答えよ.
制約
- .
- .
- は からなる長さ の文字列.
- 個のテストケースにおける の総和は 以下.
解法
回の操作における にある の数の変化は のどれかである. よって, 偶奇は常に一定であり, 最終的に目指すべき文字列は にある の数が 個の文字列である.
よって, を 「 にある の数」とすると目標を達成するための必要条件は が偶数である.
これ以降, は偶数であるとする.
- のとき, 操作可能な の選び方は に限る. よって, か のみ目標を達成可能で, それ以外は目標達成不可能である. そして, この つの文字列における最小回数はそれぞれ である.
- とする.
- のとき, 既に目標を達成しているので, 最小回数は である.
- のとき, である を昇順に としたとき, に対して, であるから, に対して を にすることを繰り返せば良い. また, これが最小回数を達成する.
- のとき
- に連続する部分列として を含まないとき, 2つの がある添字の差は 以上であるから, 回の操作で目標を達成できる. なお, である.
- に連続する部分列として を含むとき
- に連続部分列として を含むとき, この部分に着目して次のように操作すると, であるから, 目標を達成できる. . しかも, この 回がこれが最小回数である.
- に連続部分列として を含むとき, 上の場合と同様にして 回が最小回数である.
- に連続部分列として を含まないとき, という場合分けの条件も合わせると, これを満たすのは しかない. これは次のようにして 回が最小回数になる.
これらをまとめると, 求めるべき解答は 文字列 が文字列 の連続部分列であるということを と表すことにすると,
となる.
時間計算量は 時間である.