题意:可以简单理解成,存在多少对不重叠的非空区间,且区间异或值相等
思路:根据前缀异或和的性质,设
表示
的区间异或和,那么
的区间异或值就等于
,因为
只有
,双重
循环遍历,枚举端点
,先记录以
为右端点的所有区间异或值,存到
数组,然后再记录以
为左端点的值,保证区间不重叠,更新答案
时间复杂度:
代码:
#include <bits/stdc++.h> using namespace std; #define ll long long const int maxn = 1005; int a[maxn],pre[maxn],b[1000010]; int main() { int n; ll ans = 0; cin>>n; for(int i=1;i<=n;i++)cin>>a[i],pre[i] = pre[i-1]^a[i]; for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++) b[pre[j-1]^pre[i]]++; for(int j=i+1;j<=n;j++) ans += 1ll*b[pre[j]^pre[i]]; } cout<<ans<<endl; return 0; }