Guest User

Trie implementation for XOR problem

a guest
Dec 17th, 2016
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.17 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4.  
  5. /**
  6.  * Created by arpit on 16/12/16.
  7.  */
  8. class NikitoshAndXor {
  9.  
  10.     static final int MAX=400000;
  11.     static int a[]=new int[MAX],maxPrefix[]=new int[MAX],maxSuffix[]=new int[MAX];
  12.  
  13.     public static void main(String[] args) throws IOException {
  14.         BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  15.         int n;
  16.         String s[];
  17.         n=Integer.parseInt(br.readLine());
  18.         s=br.readLine().split("\\s");
  19.  
  20.         for (int i = 0; i < n; i++) {
  21.             a[i]=Integer.parseInt(s[i]);
  22.             maxPrefix[i]=a[i];
  23.             maxSuffix[i]=a[i];
  24.         }
  25.         System.out.println(solve(n));
  26.  
  27.     }
  28.  
  29.     private static long solve(int n) {
  30.         fillMaxPrefix(n);
  31.         fillMaxSuffix(n);
  32.         long ans=Integer.MIN_VALUE;
  33.  
  34.         for (int i = 0; i < (n - 1); i++)
  35.             ans = Long.max(ans, maxPrefix[i] + maxSuffix[i + 1]);
  36.  
  37.         return ans;
  38.     }
  39.  
  40.     private static void fillMaxSuffix(int n) {
  41.         Trie suffixTrie=new Trie();
  42.         int suff=a[n-1];
  43.         suffixTrie.insert(0);
  44.         suffixTrie.insert(a[n-1]);
  45.         for (int i = n-2; i>=0; i--) {
  46.             suff^=a[i];
  47.             maxSuffix[i]=Integer.max(maxSuffix[i+1], suffixTrie.query(suff));
  48.             suffixTrie.insert(suff);
  49.         }
  50.     }
  51.  
  52.     private static void fillMaxPrefix(int n) {
  53.         Trie prefixTrie = new Trie();
  54.         int pre=a[0];
  55.         prefixTrie.insert(0);
  56.         prefixTrie.insert(a[0]);
  57.         for (int i = 1; i < n; i++) {
  58.             pre^=a[i];
  59.             //System.out.println(prefixTrie.query(pre));
  60.             maxPrefix[i]=Integer.max(maxPrefix[i-1],prefixTrie.query(pre));
  61.             prefixTrie.insert(pre);
  62.         }
  63.     }
  64.  
  65.     static class Trie{
  66.  
  67.         TrieNode root;
  68.  
  69.         public Trie() {
  70.             root=new TrieNode();
  71.         }
  72.  
  73.         class TrieNode{
  74.             int val;
  75.             TrieNode[]child;
  76.  
  77.             public TrieNode() {
  78.                 child=new TrieNode[2];
  79.             }
  80.         }
  81.         void insert(int key){
  82.  
  83.             TrieNode temp=root;
  84.             for (int i = 31; i>=0; i--) {
  85.                 int currBit;
  86.                 if ((key&(1<<i))>=1)currBit=1;
  87.                 else currBit=0;
  88.  
  89.                 if (temp.child[currBit]!=null){
  90.                     temp=temp.child[currBit];
  91.                 }
  92.                 else{
  93.                     temp.child[currBit]=new TrieNode();
  94.                     temp=temp.child[currBit];
  95.                 }
  96.             }
  97.             temp.val=key;
  98.         }
  99.  
  100.         int query(int key){
  101.             TrieNode temp=root;
  102.             for (int i = 31; i>=0; i--) {
  103.                 int currBit;
  104.                 if ((key&(1<<i))>=1)currBit=1;
  105.                 else currBit=0;
  106.  
  107.                 if (temp.child[1-currBit]!=null){
  108.                     temp=temp.child[1-currBit];
  109.                 }
  110.                 else if (temp.child[currBit]!=null){
  111.                     temp=temp.child[currBit];
  112.                 }
  113.                 else break;
  114.             }
  115.             return temp.val^key;
  116.         }
  117.     }
  118. }
Add Comment
Please, Sign In to add comment