二分+桶枚举
#include <bits/stdc++.h>
#define int long long
#define Endl '\n'
using T = std::vector<int> ;
constexpr int N = 3e5 + 12;
constexpr int MOD = 1e9 + 7;
int n, m;
int liyiHuan() {
std::cin >> n;
T s(n+3);
for (int i=1;i <= n;i ++ ) {
std::cin >> s[i];
s[i] ^= s[i-1];
}
int maxn = 1e5 + 12;
for (int i=1;i <= n;i ++ )
for (int j=i;j <= n;j ++ )
maxn = std::max(s[j] ^ s[i-1], maxn);
// h[i] 表示 [fr ... sc] = i, h[i] 内按fr从小到大
std::vector<std::vector<std::array<int, 2>>> h(maxn+7, std::vector<std::array<int, 2>> ());
std::vector<std::array<int, 3>> Qir(1);
for (int i=1;i <= n;i ++ ) {
for (int j=i;j <= n;j ++ ) {
int x = s[j] ^ s[i-1];
Qir.push_back({i, j, x}); // <l, r, x>
h[x].push_back({i, j});
}
}
auto find = [&](int L, int R, int x) -> int {
int l = 0, r = h[x].size(), ok = h[x].size();
while (l <= r) {
int mid = (l+r) / 2;
if (h[x][mid][0] > R) { // 可以更小
ok = mid, r = mid - 1;
} else l = mid + 1;
}
return h[x].size() - ok;
};
int ans = 0;
for (auto& u:Qir) {
if (u == *Qir.begin()) continue ;
ans += find(u[0], u[1], u[2]);
}
std::cout << ans << Endl;
return 0;
}
int32_t main() {
std::cin.tie(nullptr) -> sync_with_stdio(false);
int T(1); //std::cin>>T;
while (T -- )
liyiHuan();
return 0;
}