图片说明
思路:我们知道[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;
}