Codeforces Round #668 (Div. 2) C. Balanced Bitstring
気づき
- インデックス mod K で一致する
- 範囲内で片方がより多く存在したら不適
1.について
問題を眺めていても閃かないので、この手の問題の常套手段をまず確認する。
- 具体的に手を動かす
- 抽象的に手を動かす
- 前から操作する
- 後ろから操作する
- 操作しても変わらない箇所(単位元)を探す
- 2回操作すると、もとに戻る操作(逆元)を探す
他にもあるだろうけど、まずはこれだけ確認しておく。
この問題については、「1」「2」「5(の亜種)」がヒントとなる。
1.はサンプルなどを具体的に操作して問題を理解するだけなので、スルー。
2.、5.について、fig.1のように考えると、
与えられる文字列を、の文字目を、範囲の長さをとして、
とは等しくなければならないとわかる。
よって、任意のについて、が要求される。
ここでこの気付きを、5.(の亜種)としたのは、範囲を一つずらしたとき、長さの共通部分があり、その範囲内の0と1の数は変わらないので、共通部分の左右は同じ値になる、という、変化しない共通部分を見つけていることに対応する。
これらの事実より、が成り立たない場合、その時点で不適。
また、が成り立たないといけないので、が等しいインデックスの中に「」と「または」が存在すると、は、どちらかに決定する。
これらの操作をすると、が常に成り立つ状態になるので、始点からに対して、含まれるの数がより大きくないかチェックすればOK。
( がより多い場合、含まれるをすべてにしても不適だから)
始点からだけチェックすれば大丈夫なのは、具体的にコードを書いてみるとわかるが、;K]]という配列をとって、
a[i%K].push(S[i])
と追加して、を決定する操作をすると、任意についてとなるので、の範囲で始点を試せば、あとは同じチェックになる。