给定一个长度为n的非负整数序列{An},求序列的所有子区间异或值之和模998244353,和所有子区间之和的异或值。
n≤105,Ai≤106。
题解:
先考虑第一问。
令xor(i)表示前i项的异或值,xor(l,r)表示第l项到第r项的异或值,那么xor(l,r)=xor(r)⊕xor(l−1)。
考虑xor(l,r)的二进制第k位是1的可能情况,当且仅当xor(r)和xor(l−1)的二进制第k位不同。
那么我们可以固定右端点r,算出有多少个l使xor(l,r)的第k位是1,假设已经算出右端点为r的答案,现在可以O(1)推到右端点为r+1的答案,因为对于r+1来说新增的l只有r+1一个,只需要O(1)将贡献产生即可。时间复杂度O(nlogA)。
Mycode:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
int sum[maxn],a[maxn],c[maxn];