1 条题解

  • 0
    @ 2026-9-9 22:21:51

    思路

    固定翻转长度 kk,从左到右考察每个位置。在开始处理位置 ii 时,所有起点小于 ii 的操作已经确定。起点大于 ii 的操作不能改变位置 ii,因此当前位置若为 0,就必须执行一次以 ii 为起点的翻转;若为 1,则不能执行这次翻转。

    同一个窗口翻转两次会抵消,所以只需考虑每个窗口翻转零次或一次。这个局部选择因此没有分支。

    做法

    从 nn 到 11 枚举 kk,对每个 kk 重新建立长度为 n+1n+1 的异或差分数组,并将当前翻转奇偶性设为 00。

    采用从 00 开始的位置编号。处理位置 ii 时,先将差分数组在 ii 处的值异或到当前奇偶性中,从而移除已经到期的翻转。用原字符与当前奇偶性求出实际字符。

    若实际字符为 0,检查 i+k≤ni+k\le n。不满足时,当前 kk 不可行;满足时立刻翻转当前奇偶性,并在 i+ki+k 处记录一次到期事件。若扫描结束时没有失败,则找到了可行长度。

    第一次成功的 kk 就是最大值。k=1k=1 总是可行,因此一定有答案。原串已经全为 1 时无需操作,答案为 nn。

    正确性证明

    固定 kk。按起点递增的顺序决定每个窗口是否翻转,不影响最终结果,因为异或操作可以交换顺序。假设前 ii 个位置已经变为 1。再翻转任何起点小于 ii 的窗口都会改变之前已经固定的决定;而起点大于 ii 的窗口无法覆盖位置 ii。所以唯一剩余的选择是以 ii 为起点的窗口,其使用与否被位置 ii 的当前值唯一确定。

    如果当前位置为 0 且剩余长度不足 kk,不存在能修复它的合法操作,所以判定失败正确。否则按上述强制选择处理后,位置 ii 也变为 1,归纳不变式继续成立。扫描成功当且仅当该长度存在合法方案。

    差分数组记录每次翻转作用区间的右端点,进入该位置时恰好撤销对应影响,所以维护的字符值与实际逐次翻转一致。最后按长度递减枚举,返回的第一个可行值就是全局最大值。

    部分分做法

    对于子任务 1,枚举每个长度下所有窗口的翻转与否,直接执行操作并检查最终字符串。窗口操作可交换且重复两次抵消,故枚举覆盖全部可能。最坏时间为 O(n22n)O(n^2 2^n),额外空间为 O(n)O(n)。

    对于子任务 2,仍然使用上述强制起点贪心,但直接修改每个窗口中的全部字符。固定长度最坏需要 O(nk)O(nk),枚举所有长度为 O(n3)O(n^3),额外空间为 O(n)O(n)。在该子任务中,一个文件内 ∑n3≤250∑n2≤62500000\sum n^3\le250\sum n^2\le62500000。

    对于子任务 3,以异或差分代替逐字符修改,即为满分做法。

    复杂度

    固定 kk 的扫描和差分数组初始化都是 O(n)O(n),总时间为 O(n2)O(n^2),额外空间为 O(n)O(n)。所有测试数据的总时间为 O(∑n2)O(\sum n^2),满足原题给定的平方和限制。

    • 1

    信息

    ID
    1691
    时间
    3000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者