Tarango

Codechef REBXOR

Sep 21st, 2015
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.63 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define M 29
  6. #define MAXN 400000+5
  7. #define INF (int)1e9
  8.  
  9. int N;
  10. int a[MAXN];
  11. int L[MAXN];
  12. int R[MAXN];
  13.  
  14. int id = 0;
  15. struct node {
  16.     int link[2];
  17.     node() {
  18.         link[0] = link[1] = -1;
  19.     }
  20. };
  21. node trie[30 * MAXN];
  22.  
  23. int new_node() {
  24.     return id++;
  25. }
  26.  
  27. inline void insert(int cur, int v) {
  28.     int two_p = (1<<M);
  29.     for (int i = 0; i <= M; i++) {
  30.         int nxt = (v & two_p) != 0;
  31.         if (trie[cur].link[nxt] == -1)  trie[cur].link[nxt] = new_node();
  32.         cur = trie[cur].link[nxt];
  33.         two_p >>= 1;
  34.     }
  35. }
  36.  
  37. inline int find_max(int cur, int v) {
  38.     int ans = 0, two_p = (1<<M);
  39.     for (int i = 0; i <= M; i++) {
  40.         int nxt = (v & two_p) != 0;
  41.         if (trie[cur].link[1 - nxt] != -1) {
  42.             ans ^= two_p;
  43.             cur = trie[cur].link[1 - nxt];
  44.         } else {
  45.             cur = trie[cur].link[nxt];
  46.         }
  47.         two_p >>= 1;
  48.     }
  49.     return ans;
  50. }
  51.  
  52. void clear_trie() {
  53.     for (int i = 0; i <= id; i++) {
  54.         trie[i].link[0] = -1;
  55.         trie[i].link[1] = -1;
  56.     }
  57.     id = 0;
  58. }
  59.  
  60. int root_L;
  61. int root_R;
  62.  
  63. int main() {
  64.     scanf("%d", &N);
  65.     int ans = 0;
  66.    
  67.     int lval = 0;
  68.     root_L = new_node();
  69.     insert(root_L, 0);
  70.     for (int i = 0; i < N; i++) {
  71.         scanf("%d", &a[i]);
  72.         lval ^= a[i];
  73.         L[i] = max((i == 0) ? 0 : L[i-1], find_max(root_L, lval));
  74.         insert(root_L, lval);
  75.     }
  76.    
  77.     clear_trie();
  78.     int rval = 0;
  79.     root_R = new_node();
  80.     insert(root_R, 0);
  81.     for (int i = N-1; i > 0; i--) {
  82.         rval ^= a[i];
  83.         R[i] = max((i == N-1) ? 0 : R[i+1], find_max(root_R, rval));
  84.         insert(root_R, rval);
  85.         int cand = R[i] + (i == 0 ? -INF : L[i-1]);
  86.         if (cand > ans) ans = cand;
  87.     }
  88.     printf("%d\n", ans);
  89. }
Advertisement
Add Comment
Please, Sign In to add comment