令 ,。记整个序列的 XOR 为 。
分割操作等价于在保持 两个端点不变的情况下,在内部插入一个任意值。把 分割为 时,新插入的前缀 XOR 为 。反过来,合并操作恰好删除一个内部前缀 XOR 。
如果最终序列长度为 ,且所有元素都等于 ,那么它的前缀 XOR 序列为
两种操作都不会改变总 XOR 。
的情况
此时 必须为奇数,并且必有 。目标前缀 XOR 序列为 。
从原来的 中只保留值为 或 的元素。把得到的序列划分为若干个值相同的极大连续段,设段数为 。每段只保留一个元素,就会得到 。其余前缀元素都必须删除,因此答案为
的情况
设内部前缀 XOR 中非零元素的个数为 。设完整前缀序列中相邻两个零之间的区间数为 。
若选择 ,删除所有非零内部前缀即可,代价为 。
现在固定 。保留所有值为 的前缀不会使最优解变差。每两个相邻的零之间,在目标序列中恰好需要一个 。设至少包含一次值 的区间数为 。在这些区间中可以保留一个 ,少删除一次;在不含 的区间中则需要插入一个 。因此代价为
令 ,最终答案为
可以通过一次从左到右的扫描求出 。每遇到一个值为 的前缀就增加区间编号。对于每个非零值 ,在哈希表中记录它上一次被计数的区间编号,以及包含 的不同区间数量。这样同一区间内多次出现的 只会被计数一次。
期望时间复杂度为 ,空间复杂度为 。
Solution written by GPT5.6