1. 程式人生 > >xian 區域賽 g bzoj 4017: 小Q的無敵異或

xian 區域賽 g bzoj 4017: 小Q的無敵異或

 求任意區間的異或和  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;
}