思路:我们知道[i, j]和区间[x, y]异或为0.那么我们枚举右区间端点。那么每次新增加的贡献为左区间异或值为Xor[x, j]的个数。我们在扫描的时候,可以维护所有的左区间的值和个数。
#include <bits/stdc++.h> #define LL long long using namespace std; int a[1005], s[1005]; LL f[1<<20]; int main(){ int n, x; scanf("%d", &n); for(int i=1; i<=n; i++){ scanf("%d", &a[i]); s[i]=s[i-1]^a[i]; } LL ans=0; for(int l2=1; l2<=n; l2++){ for(int l1=1; l1<l2; l1++){ f[s[l1-1]^s[l2-1]]++; } for(int r2=l2; r2<=n; r2++){ ans+=f[s[l2-1]^s[r2]]; } } printf("%lld\n", ans); return 0; }