给定一个长度为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];
int main()
{
    int n;
    scanf("%d",&n);
    sum[0] = 0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        sum[i] = sum[i]^a[i];
    }
    int ans = 0;
    for(int k=0;k<=29;k++)
    {
        c[0] =1 ,c[1] =0;
        for(int i=1;i<=n;i++)
        {
            int v = (sum[i]&(1<<k))?1:0;
            ans+=((1<<(k))*c[v^1])%mod;
            c[v]++;
        }
    }
    cout<<ans<<endl;

    return 0;
}

1 拆位做法
2 题目链接
3 第二问做法
第二问做法2
第二问做法3
官方题解
4 其他异或问题
5 更多异或问题:最大异或和
异或之