题意:就是求所有子区间的异或和的和
题解:就是算每一位对结果的贡献(最近好像遇到很多次这种题目),先前缀异或,从左向右扫记录二进制前缀的1,0个数,xor[i]==xor[j]^1的时候就加上这一位的权值
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define mod 20090717 #define C 0.5772156649 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define pii pair<int,int> using namespace std; const double g=10.0,eps=1e-12; const int N=200000+10,maxn=200000+10,inf=0x3f3f3f3f; ll a[N]; ll one[50],zero[50]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; for(int i=1;i<=n;i++)cin>>a[i],a[i]^=a[i-1]; ll sum=0; for(int i=0;i<=n;i++) { for(int j=0;j<30;j++) { if(((a[i]>>j)&1))//1 { sum+=zero[j]*(1ll<<j); one[j]++; } else { sum+=one[j]*(1ll<<j); zero[j]++; } } } cout<<sum<<endl; return 0; } /******************** 2 1 2 ********************/
原文:http://www.cnblogs.com/acjiumeng/p/7896372.html