CF729D Sea Battle

题目描述

Galya 正在一个 $1 \times n$ 的网格上玩一维“海战”游戏。在这个游戏中,$a$ 艘战舰被放置在网格上。每艘战舰都占据连续的 $b$ 个格子。一个格子不能同时属于两艘船,但是船只之间可以相互接触。 Galya 并不知道船的位置。她可以向某些格子射击,每射击一次,会告知她该格子是否有船(这种情况称为“命中”),否则称为“未命中”。 Galya 已经进行了 $k$ 次射击,所有的结果都是未命中。 你的任务是计算,Galya 至少还需要再向多少个格子射击,才能保证无论船如何放置,至少能够命中一艘船。 保证至少存在一种合理的舰船摆放方式。

输入格式

第一行包含四个正整数 $n$、$a$、$b$、$k$($1 \le n \le 2 \cdot 10^5$,$1 \le a,b \le n$,$0 \le k \le n-1$),分别表示网格长度、舰船数量、每艘舰船的长度以及 Galya 已经射击的格子数量。 第二行包含一个长度为 $n$ 的仅由 $0$ 和 $1$ 组成的字符串。如果第 $i$ 个字符为 $1$,表示 Galya 已经射击了第 $i$ 个格子。否则她未曾射击。保证该字符串中恰好有 $k$ 个 $1$。

输出格式

第一行输出最少还需射击的格子数,使得无论战舰如何摆放,至少有一艘船能够被命中。 第二行输出这些需要射击的格子的编号,每个编号只能输出一次,编号范围为 $1$ 到 $n$(从左到右编号)。 你可以按照任意顺序输出格子编号。如果有多种方案,你可以输出其中任意一种。

说明/提示

在第一个样例中,有一艘船。它可能在 Galya 已经射击过的格子的左边,也可能在右边。因此,至少需要再分别射击左端和右端各一个格子,共两次。 由 ChatGPT 5 翻译