$$我们知道, 如果两个数xor后得0,那么这两个数相同,其次,异或运算也是满足前缀和的$$
$$所以我们可以枚举区间的右端点,把不同区间的异或和处理出来,然后枚举其后面的区间$$
$$找到其中有多少个异或和在之前出现过即可$$
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100010;
int a[N];
int n, s[N];
ll ans;
unordered_map<int, int> cnt;
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i], s[i] = a[i] ^ s[i-1];
for(int i = 1; i <= n; i ++)
{
for(int j = 0; j < i; j ++)
{
int t = s[i] ^ s[j];
cnt[t] ++;
}
for(int j = i + 1; j <= n; j ++)
{
int t = s[i] ^ s[j];
ans += cnt[t];
}
}
cout << ans << endl;
}