二分+桶枚举

#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;
}