题解:把所有区间的异或和都求出来并且吧右端点放入数组中,最后枚举每个区间二分查找前面有几个右端点的区间小于该区间的左端点,最后答案就是该总和。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long int ll;
#define x first
#define y second
const int mx = 2e5+5;
int a[1005];
vector<int>g[mx];
int n;
int main(){
while(scanf("%d",&n)!=EOF){
for(int i = 0; i < mx; i++)
g[i].clear();
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
long long ans = 0;
for(int i = 1; i <= n; i++){
int sum = 0;
for(int j = i; j >= 1; j--){
sum^=a[j];
g[sum].push_back(i);
}
}
for(int i = 1; i <= n; i++){
int sum = 0;
for(int j = i; j >= 1; j--){
sum^=a[j];
ans += lower_bound(g[sum].begin(),g[sum].end(),j)-g[sum].begin();
}
}
printf("%lld\n",ans);
}
return 0;
}