Solution:
首先,一个区间的异或和可以由前缀异或和得到。即sum[l,r]=sum[r]^sum[l-1];
枚举左区间的右端点,再枚举左区间的左端点,开一个桶记录个数,再以该左区间右端点+1为右区间左端点,记录与左区间异或和相等的右区间个数,以此累加即为答案。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e6+5;
ll n,x,res,a[N],b[N];
int main()
{
cin>>n;
for(ll i=1;i<=n;i++)
{
cin>>x;
a[i]=a[i-1]^x;
}
for(ll i=1;i<=n;i++)
{
for(ll j=0;j<i;j++)
b[a[i]^a[j]]++;
for(ll j=i+1;j<=n;j++)
res+=b[a[i]^a[j]];
}
cout<<res<<'\n';
return 0;
}
京公网安备 11010502036488号