#include <bits/stdc++.h>
using namespace std;
long long ini;
struct TrieNode {
  long long value;
  TrieNode *arr[2];
};
TrieNode *newNode() {
  TrieNode *temp = new TrieNode;
  temp->value = 0;
  temp->arr[0] = temp->arr[1] = NULL;
  return temp;
}
void insert(TrieNode *root, long long pre_xor) {
  TrieNode *temp = root;
  for (int i = 41 - 1; i >= 0; i--) {
    bool val = pre_xor & (1LL << i);
    if (temp->arr[val] == NULL) temp->arr[val] = newNode();
    temp = temp->arr[val];
  }
  temp->value = pre_xor;
}
long long query(TrieNode *root, long long pre_xor) {
  TrieNode *temp = root;
  for (int i = 41 - 1; i >= 0; i--) {
    bool val = pre_xor & (1LL << i);
    if (temp->arr[1 - val] != NULL)
      temp = temp->arr[1 - val];
    else if (temp->arr[val] != NULL)
      temp = temp->arr[val];
  }
  return pre_xor ^ (temp->value);
}
long long maxSubarrayXOR(long long arr[], long long n) {
  TrieNode *root = newNode();
  insert(root, 0);
  long long result = ini, pre_xor = 0;
  for (int i = 0; i < n; i++) {
    pre_xor = pre_xor ^ arr[i];
    insert(root, pre_xor);
    result = max(result, query(root, pre_xor ^ ini));
  }
  return result;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long arr[100000], n;
  cin >> n;
  for (int i = 0; i < n; i++) cin >> arr[i], ini ^= arr[i];
  cout << maxSubarrayXOR(arr, n);
  return 0;
}
