Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define M 29
- #define MAXN 400000+5
- #define INF (int)1e9
- int N;
- int a[MAXN];
- int L[MAXN];
- int R[MAXN];
- int id = 0;
- struct node {
- int link[2];
- node() {
- link[0] = link[1] = -1;
- }
- };
- node trie[30 * MAXN];
- int new_node() {
- return id++;
- }
- inline void insert(int cur, int v) {
- int two_p = (1<<M);
- for (int i = 0; i <= M; i++) {
- int nxt = (v & two_p) != 0;
- if (trie[cur].link[nxt] == -1) trie[cur].link[nxt] = new_node();
- cur = trie[cur].link[nxt];
- two_p >>= 1;
- }
- }
- inline int find_max(int cur, int v) {
- int ans = 0, two_p = (1<<M);
- for (int i = 0; i <= M; i++) {
- int nxt = (v & two_p) != 0;
- if (trie[cur].link[1 - nxt] != -1) {
- ans ^= two_p;
- cur = trie[cur].link[1 - nxt];
- } else {
- cur = trie[cur].link[nxt];
- }
- two_p >>= 1;
- }
- return ans;
- }
- void clear_trie() {
- for (int i = 0; i <= id; i++) {
- trie[i].link[0] = -1;
- trie[i].link[1] = -1;
- }
- id = 0;
- }
- int root_L;
- int root_R;
- int main() {
- scanf("%d", &N);
- int ans = 0;
- int lval = 0;
- root_L = new_node();
- insert(root_L, 0);
- for (int i = 0; i < N; i++) {
- scanf("%d", &a[i]);
- lval ^= a[i];
- L[i] = max((i == 0) ? 0 : L[i-1], find_max(root_L, lval));
- insert(root_L, lval);
- }
- clear_trie();
- int rval = 0;
- root_R = new_node();
- insert(root_R, 0);
- for (int i = N-1; i > 0; i--) {
- rval ^= a[i];
- R[i] = max((i == N-1) ? 0 : R[i+1], find_max(root_R, rval));
- insert(root_R, rval);
- int cand = R[i] + (i == 0 ? -INF : L[i-1]);
- if (cand > ans) ans = cand;
- }
- printf("%d\n", ans);
- }
Advertisement
Add Comment
Please, Sign In to add comment