我们要求序列的层级异或特征 C1,C2,…,Cn,其中 Ck 定义为所有长度为 k 的连续子段异或和的异或。直接对每个 k 重新计算所有子段异或和的复杂度为 O(n2),无法通过 n≤2×105 的数据范围。我们需要利用异或的性质进行递推。
前缀异或和
构造前缀异或和数组 s,其中 s[i]=a1⊕a2⊕⋯⊕ai(规定 s[0]=0)。利用前缀异或和可以在 O(1) 时间内求出任意区间 [l,r] 的异或和:
递推关系
在一段长度为 n 的数据序列中,我们需要提取不同尺度下的异或特征。
对于任意长度 k (1≤k≤n),定义第 k 阶特征值 Ck 为:所有长度为 k 的连续子段各自内部元素的异或和,再将这些异或和进行异或运算得到的最终结果。
换句话说,设序列为 a1,a2,…,an,子段 [i,i+k−1] 的内部异或和为 Xi=ai⊕ai+1⊕⋯⊕ai+k−1。则 Ck=X1⊕X2⊕⋯⊕Xn−k+1。
现在给定序列的全部数值,请计算出 C1,C2,…,Cn。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册