Official

D - Logical Filling Editorial by nok0


丁寧な場合分けが要求される問題です。

まず、\(S\) 内部で o に隣接してる ? は全て . に置き換えておきます。

\(S\) に含まれる o の個数が \(K\) と等しいとき

\(S\)? を全て . に置き替えて得られる文字列が答えです。

以下それ以外の場合を考えます。まず、o が連続しないように \(S\)? を置き換える方法であって、o の個数が最大になるものを一つ求めます。これは左から順に、?o に置き換えても o が連続しないなら置き換えるという操作を貪欲に行うことで可能です。

このときの o の個数を \(M\) とします。

\(M=K\) のとき

o の個数を最大化します。 ? が奇数個続いているとき、その部分の置き換え方は o.o.o のように一意に定まります。一方、? が偶数個続いている場合は o.o..o.o\(2\) パターン考えられます。

そのため、? が偶数個続いている場合はそのままで、奇数個続いている場合は先頭から二個飛ばしでo に、残りを . に置き換えたものが答えです。

\(M>K\) のとき

\(S\) そのものが答えです。

証明:o の個数を最大化したものから一部の o を削ることで、大体の ?\(2\) パターンできます。問題は ? が奇数個連続している場所ですが、そこを最初 .o.o. で置き換えておくことで o の個数が \(M-1\) を達成できて、そこから何個か削ることで、その部分も o, . どちらもあり得る状態にできます。

posted:
last update: