1 条题解
-
0
思路
固定翻转长度 ,从左到右考察每个位置。在开始处理位置 时,所有起点小于 的操作已经确定。起点大于 的操作不能改变位置 ,因此当前位置若为
0,就必须执行一次以 为起点的翻转;若为1,则不能执行这次翻转。同一个窗口翻转两次会抵消,所以只需考虑每个窗口翻转零次或一次。这个局部选择因此没有分支。
做法
从 到 枚举 ,对每个 重新建立长度为 的异或差分数组,并将当前翻转奇偶性设为 。
采用从 开始的位置编号。处理位置 时,先将差分数组在 处的值异或到当前奇偶性中,从而移除已经到期的翻转。用原字符与当前奇偶性求出实际字符。
若实际字符为
0,检查 。不满足时,当前 不可行;满足时立刻翻转当前奇偶性,并在 处记录一次到期事件。若扫描结束时没有失败,则找到了可行长度。第一次成功的 就是最大值。 总是可行,因此一定有答案。原串已经全为
1时无需操作,答案为 。正确性证明
固定 。按起点递增的顺序决定每个窗口是否翻转,不影响最终结果,因为异或操作可以交换顺序。假设前 个位置已经变为
1。再翻转任何起点小于 的窗口都会改变之前已经固定的决定;而起点大于 的窗口无法覆盖位置 。所以唯一剩余的选择是以 为起点的窗口,其使用与否被位置 的当前值唯一确定。如果当前位置为
0且剩余长度不足 ,不存在能修复它的合法操作,所以判定失败正确。否则按上述强制选择处理后,位置 也变为1,归纳不变式继续成立。扫描成功当且仅当该长度存在合法方案。差分数组记录每次翻转作用区间的右端点,进入该位置时恰好撤销对应影响,所以维护的字符值与实际逐次翻转一致。最后按长度递减枚举,返回的第一个可行值就是全局最大值。
部分分做法
对于子任务 1,枚举每个长度下所有窗口的翻转与否,直接执行操作并检查最终字符串。窗口操作可交换且重复两次抵消,故枚举覆盖全部可能。最坏时间为 ,额外空间为 。
对于子任务 2,仍然使用上述强制起点贪心,但直接修改每个窗口中的全部字符。固定长度最坏需要 ,枚举所有长度为 ,额外空间为 。在该子任务中,一个文件内 。
对于子任务 3,以异或差分代替逐字符修改,即为满分做法。
复杂度
固定 的扫描和差分数组初始化都是 ,总时间为 ,额外空间为 。所有测试数据的总时间为 ,满足原题给定的平方和限制。
- 1
信息
- ID
- 1691
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者