#include <bits/stdc++.h>
using namespace std;
long long ans, p, s;
int N;
struct node {
  int a[2];
  node *L, *R;
  node() {
    a[0] = a[1] = 0;
    L = R = NULL;
  }
  void add() {
    if (L == NULL) L = new node();
    if (R == NULL) R = new node();
  }
};
void update(node *no, long long x, int h, int inc) {
  no->add();
  if (h < 0) return;
  if (!(x & (1LL << h)))
    no->a[0]++, update(no->L, x, h - 1, inc);
  else
    no->a[1]++, update(no->R, x, h - 1, inc);
}
long long query(node *no, long long x, int h) {
  if (h < 0) return 0;
  no->add();
  if (!(x & (1LL << h)) && no->a[1]) return (1LL << h) + query(no->R, x, h - 1);
  if ((x & (1LL << h)) && no->a[0]) return (1LL << h) + query(no->L, x, h - 1);
  if (no->a[0]) return query(no->L, x, h - 1);
  if (no->a[1]) return query(no->R, x, h - 1);
  return 0LL;
}
int main(int argc, char **argv) {
  node *no;
  no = new node();
  scanf("%d", &N);
  vector<long long> a(N);
  for (auto &x : a) scanf("%I64d", &x);
  update(no, s, 42, 1);
  for (int i = (N - 1); i >= (0); i--) {
    s ^= a[i];
    ans = max(ans, s);
    update(no, s, 42, 1);
  }
  for (int i = (0); i < (N); i++) {
    p ^= a[i];
    s ^= a[i];
    update(no, s, 42, -1);
    ans = max(ans, query(no, p, 42));
    ans = max(ans, p);
  }
  printf("%I64d\n", ans);
  return 0;
}
