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; }