DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类DLC比赛小组团队讨论区
排名
解题数量排行榜连续解题排名DOJ Power 排行榜
评测状态
征题登录注册
DOJ logoDOJ

支持 OI 子任务计分、Elo 等级分和 Discord 认证的社区在线评测系统。

题目
题目列表分类
社区
比赛排名讨论区公告举办外部比赛指南
账号
登录注册评测状态
政策
服务条款DLC 使用规则隐私政策API 文档语言运行环境比赛排名奖励评级与表现
© 2026 DOJ
保留所有权利
题解

XOR 合并

返回题目

题解

令 P0=0P_0=0P0​=0,Pi=A1⊕A2⊕⋯⊕AiP_i=A_1\oplus A_2\oplus\cdots\oplus A_iPi​=A1​⊕A2​⊕⋯⊕Ai​。记整个序列的 XOR 为 S=PNS=P_NS=PN​。

分割操作等价于在保持 PPP 两个端点不变的情况下,在内部插入一个任意值。把 AiA_iAi​ 分割为 x,yx,yx,y 时,新插入的前缀 XOR 为 Pi−1⊕xP_{i-1}\oplus xP。反过来,合并操作恰好删除一个内部前缀 XOR 。

如果最终序列长度为 mmm,且所有元素都等于 kkk,那么它的前缀 XOR 序列为

0,k,0,k,⋯ .0,k,0,k,\cdots.0,k,0,k,⋯.

两种操作都不会改变总 XOR SSS。

S≠0S\ne 0S=0 的情况

此时 mmm 必须为奇数,并且必有 k=Sk=Sk=S。目标前缀 XOR 序列为 0,S,0,S,⋯ ,S0,S,0,S,\cdots,S0,S,0,S,⋯,S。

从原来的 PPP 中只保留值为 000 或 SSS 的元素。把得到的序列划分为若干个值相同的极大连续段,设段数为 CCC。每段只保留一个元素,就会得到 0,S,0,S,⋯ ,S0,S,0,S,\cdots,S0,S,0,S。其余前缀元素都必须删除,因此答案为

N+1−C.N+1-C.N+1−C.

S=0S=0S=0 的情况

设内部前缀 XOR P1,⋯ ,PN−1P_1,\cdots,P_{N-1}P1​,⋯,PN−1​ 中非零元素的个数为 MMM。设完整前缀序列中相邻两个零之间的区间数为 。

若选择 k=0k=0k=0,删除所有非零内部前缀即可,代价为 MMM。

现在固定 k≠0k\ne 0k=0。保留所有值为 000 的前缀不会使最优解变差。每两个相邻的零之间,在目标序列中恰好需要一个 kkk。设至少包含一次值 kkk 的区间数为 HkH_k。在这些区间中可以保留一个 ,少删除一次;在不含 的区间中则需要插入一个 。因此代价为

M−Hk+(G−Hk)=M+G−2Hk.M-H_k+(G-H_k)=M+G-2H_k.M−Hk​+(G−Hk​

令 H=max⁡HkH=\max H_kH=maxHk​,最终答案为

min⁡(M, M+G−2H).\min(M,\ M+G-2H).min(M, M+G−2H).

可以通过一次从左到右的扫描求出 HHH。每遇到一个值为 000 的前缀就增加区间编号。对于每个非零值 vvv,在哈希表中记录它上一次被计数的区间编号,以及包含 vvv 的不同区间数量。这样同一区间内多次出现的 vvv 只会被计数一次。

期望时间复杂度为 O(N)O(N)O(N),空间复杂度为 O(N)O(N)O(N)。

Solution written by GPT5.6

i−1
​
⊕
x
PiP_iPi​
,
⋯
,
S
GG
G
Hk​
kkk
kkk
kkk
)
=
M+
G−
2Hk​.