前缀异或建模。
设前缀异或 p[i] = a1 xor a2 xor … xor ai(p[0]=0)。把数组划分为若干连续子段,对应的是选取分割点 0=i0<i1<…<im=n,第 k 段的异或值为
s_k = p[ik] xor p[ik-1]。因此问题化为:在前缀序列 p[0..n] 上选点,使相邻点的“异或差”序列 s1..sm 构成**驼峰(交替上升/下降)**序列,且段数 m 最大。
值域仅 0..255 的关键性质。
因为 ai∈[0,255],任意前缀异或 p[i] 也在 0..255。这使得可以用“值压缩 DP”,在每个前缀值上聚合最优状态,从而把状态数量限制在常数级(256)。
小明正在分析一段长度为 n 的信号序列 a1,a2,…,an,每个信号值是一个 0 到 255 之间的整数。
对于任意一个连续非空信号段 [l,r],定义其“融合值”为该段内所有信号进行按位模 2 加法(二进制下对应位相加后模 2)得到的累计结果。直观地说,就是不断将段内相邻两个信号的融合值再进行融合,最后的整段融合值。
现在需要把整个序列划分成若干个互不相交的非空连续子段,将这些子段按原序排列后,它们的融合值构成的序列 b1,b2,…,bm 必须是一个“严格振荡序列”。
严格振荡序列是指:对于任意 1<i<m,都有 bi−1<bi>bi+1 或者 bi−1>bi<bi+1。换言之,序列中没有相邻相等的元素,且相邻元素间的大小关系严格交替(形如 b1<b2>b3<b4>… 或 b1>b2<b3>b4<…)。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册