xian 區域賽 g bzoj 4017: 小Q的無敵異或
阿新 • • 發佈:2019-01-29
求任意區間的異或和 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; }