题意:
解法:
问题是计算有多少个不相交区间[l1,r1],[l2,r2],满足两区间的异或和为0,
考虑枚举l2,将[1,l2-1]的所有子区间异或和丢入map,
然后枚举r2,计算map中有多少个区间的异或值,等于[l2,r2]的异或值即可.
由于[1,x]的所有子区间异或和,等于[1,x-1]所有子区间异或和,假设以x为右端点的子区间异或和,
即具有单调性,因此map不用清空,遍历的时候维护一下即可,
算法总复杂度O(n^2*log)
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=1e3+5;
int sum[maxm];
int a[maxm];
signed main(){
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)sum[i]=sum[i-1]^a[i];
int ans=0;
map<int,int>mark;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
mark[sum[i]^sum[j-1]]++;
}
for(int j=i+1;j<=n;j++){
ans+=mark[sum[j]^sum[i]];
}
}
cout<<ans<<endl;
return 0;
}