本题首先应该记录一个异或前缀和,然后每次在移动端点的同时更新左区间的值的数量,同时我是枚举的端点,所以右边也被统计了.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+50,M=4e6+50;
int sum[N],num[M];
int main()
{
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&sum[i]);
        sum[i]^=sum[i-1];
    }ll ans=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<i;j++)
        {
            num[sum[i]^sum[j]]++;
        }
        for(int j=i+1;j<=n;j++)
        {
            ans+=num[sum[j]^sum[i]];
        }
    }printf("%lld\n",ans);
    return 0;
}
/*
    这样例给的读错题也不奇怪吧.
*/