#include <bits/stdc++.h>
using namespace std;
const long long N = 1e5 + 10;
long long n, Mx, B[N], S[N];
struct Node {
  int32_t l, r, c;
  Node() { l = r = c = 0; }
};
struct BST {
  long long L = 32;
  vector<Node> A;
  BST(long long _L = 32) {
    L = _L, A.clear();
    A.push_back(Node());
  }
  void Add(long long val, long long w = 1) {
    long long id = 0;
    for (long long i = L - 1; ~i; i--) {
      A[id].c += w;
      if (val & (1ll << i)) {
        if (!A[id].r) A[id].r = A.size(), A.push_back(Node());
        id = A[id].r;
        continue;
      }
      if (!A[id].l) A[id].l = A.size(), A.push_back(Node());
      id = A[id].l;
    }
    A[id].c += w;
  }
  long long MaxXor(long long val) {
    long long id = 0, ret = 0;
    if (!A[id].c) return (-1);
    for (long long i = L - 1; ~i; i--) {
      if (A[id].r && (!A[id].l || !(val & (1ll << i))))
        ret |= (1ll << i), id = A[id].r;
      else
        id = A[id].l;
    }
    return (ret);
  }
};
int32_t main() {
  scanf("%lld", &n);
  BST T = BST(43);
  T.Add(0);
  for (long long i = 1; i <= n; i++) scanf("%lld", &B[i]);
  for (long long i = n; i; i--) S[i] = S[i + 1] ^ B[i], T.Add(S[i]);
  for (long long i = 0, r = 0; i <= n; i++, r ^= B[i])
    Mx = max(Mx, T.MaxXor(r) ^ r), T.Add(S[i + 1], -1);
  return !printf("%lld", Mx);
}
