Kazun の競プロ記録

競技プログラミングに関する様々な話題を執筆します.

AtCoder Regular Contest 150 A問題 Continuous 1

問題

atcoder.jp

提出解答

atcoder.jp

問題の概要

 {\tt 0}, {\tt 1}, {\tt ?} からなる文字列  S が与えられる.  S にある全ての  {\tt ?} をそれぞれ  {\tt 0} または  {\tt 1} に置き換える方法で, 以下の条件を満たすものは唯一存在するか?

  •  {\tt S} のなかに  {\tt 1} がちょうど  K こ存在する.
  • その  {\tt S} にある  K 個の  {\tt 1} は連続する.

 T ケースのマルチケース

制約

  •  1 \leq T \leq 10^5
  •  1 \leq K \leq N \leq 3 \times 10^5
  •  T 個のケースにおける  N の総和は  3 \times 10^5 以下.

解法

条件を満たすような完成後の文字列は連続する区間と1対1に対応する. よって, 長さ  K の連続部分区間それぞれにおいて, その区間にのみ  {\tt 1} を並べることができることが可能かどうかを判定し. 可能である区間がちょうど1かどうかを答えれば良い.

長さ  K の連続部分区間の最初を第  i 項目とする. このとき, 長さ  K の連続部分区間 (i,i+1, \dots, i+K-1) である.

 i 項目を最初とする長さ  K の連続部分区間にのみに  {\tt 1} を並べ, それ以外は  {\tt 0} になるような  {\tt ?} への置き換えが存在することの必要十分条件は以下を共に満たすことである.

  •  S_i, S_{i+1}, \dots, S_{i+K-1} の中に  {\tt 0} が存在しない.
  •  S_i, S_{i+1}, \dots, S_{i+K-1} 以外に  {\tt 1} が存在しない.

(証明)

  • (十分性)
     i 項目を最初とする長さ  K の連続部分区間にのみに  {\tt 1} を並べる置き換えが可能なとき,  {\tt ?} の置き換えは第  i 項目から第  (i+K-1) 項目までは  {\tt 1} へ, それ以外は  {\tt 0} への置き換えが唯一である. このとき,  S\_i, S\_{i+1}, \dots, S\_{i+K-1} の中に  {\tt 0} が存在すると, 目標としている区間 {\tt 1} K 個連続しない. また,  S\_i, S\_{i+1}, \dots, S\_{i+K-1} 以外に  {\tt 1} すると, 目標としている区間 {\tt 1} K 個並んでいる場合, 全体として  {\tt 1} K 個より多くなってしまう.
  • (必要性)
     i 項目を最初とする長さ  K の連続部分区間にのみに  {\tt 1} を並べる置き換えを目指す場合,  {\tt ?} の置き換えは第  i 項目から第  (i+K-1) 項目までは  {\tt 1} へ, それ以外は  {\tt 0} への置き換えなくてはならない.  S_i, \dots, S_{i+K-1} にあるのは  {\tt 1}, {\tt ?} に限られるので, 置き換え後はこれらは全て  {\tt 1} になる. そして, それ以外には  {tt 
 0}, {\tt ?} しかないので, 置き換え後は全て  {\tt 0} になる.

これを  1 \leq i \leq N-K+1 と動かして判定すればよい. 長さ  K区間に存在する文字の個数の判定が必要になるので, 累積和で各文字の登場回数を記録すると, 各  i に対して  O(1) で判定でき, 1テストケースあたり  O(N) 時間で判定できる.