题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=4017
求任意区间的异或和 sum( i<j )
枚举右端点,记录左端点中有多少能和它异或产生贡献的左端点
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = 1e5+10;
const int mod = 1e9+7;
int sum[N], a[N], c[N];
int main()
{
int n;
sum[0]=0;
scanf("%d", &n);
for(int i=1;i<=n;i++)
{
scanf("%d", &a[i]);
sum[i]=sum[i-1]^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=(ans+(1<<k)*c[1^v])%mod;
c[v]++;
}
}
cout<<ans<<endl;
return 0;
}