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