#include <algorithm> #include <cstdio> #include <cmath> #include <iostream> #include <queue> #include <set> #include <stack> #include <map> #include <vector> #define ll long long #define si(n) scanf("%d", &n) #define sc(n) scanf("%c", &n) #define sl(n) scanf("%lld", &n) #define sd(n) scanf("%lf", &n) #define INF (int)1e9 #define LINF (long long)1e18 #define EPS 1e-9 #define gcd __gcd using namespace std; #define forall(i,a,b) for(int i=a;i<b;i++) #define foreach(v, c) for(typeof((c).begin())v=(c).begin();v!=(c).end();++v) #ifdef DEBUG #define debug(args...) {cerr<<#args<<" = "; dbg,args; cerr<<endl;} #else #define debug(args...) {args;}// Just strip off all debug tokens #endif struct debugger { template<typename T> debugger& operator , (const T& v) { cerr << v << ", "; return *this; } } dbg; #define Max(x, y) ((x) > (y) ? (x) : (y)) #define Min(x, y) ((x) > (y) ? (x) : (y)) ll lef[300000]; ll rig[300000]; map <ll, ll> cnt; ll find(ll* str, const vector <ll>& arr, ll st, ll en, ll curr, ll ind) { if (en - st == 0) { str[ind] = curr; return (ind + 1); } for (ll j = st + 1; j <= en; ++ j) { ll tot = 0; for (ll k = st; k < j; ++ k) tot += arr[k]; ll xx = curr ^ tot; ind = find(str, arr, j, en, xx, ind); } return ind; } ll fun(const vector <ll>& arr, ll st, ll en) { if (en - st <= 1) return 0; if (en - st == 2) { if ((arr[st] ^ arr[st + 1]) == 0) return 1; else return 0; } ll mid = (st + en) / 2; vector <ll> nxt(en - st - 1); for (ll i = st; i < mid - 1; ++ i) nxt[i - st] = arr[i]; nxt[mid - st - 1] = arr[mid - 1] + arr[mid]; for (ll i = mid + 1; i < en; ++ i) nxt[i - st - 1] = arr[i]; ll tot = fun(nxt, 0, en - st - 1); ll c1 = find(lef, arr, st, mid, 0, 0); ll c2 = find(rig, arr, mid, en, 0, 0); cnt.clear(); for (ll i = 0; i < c1; ++ i) cnt[lef[i]] ++; for (ll i = 0; i < c2; ++ i) tot += cnt[rig[i]]; return tot; } int main() { ll n; cin >> n; vector <ll> arr(n); for (ll i = 0; i < n; ++ i) cin >> arr[i]; cout << fun(arr, 0, n) << endl; return 0; }