https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/

class Solution {
    class Trie {
        private Trie nxt[] = new Trie[2];

        public void insert(int num) {
            Trie p = this;    //直接将当前对象当作头节点

            for (int i = 30; i >= 0; --i) {
                /* 将所有数字都化为30位二进制数,先插入最高位 */
                int b = (num >> i) & 1;
                if (p.nxt[b] == null) {
                    p.nxt[b] = new Trie();
                }
                p = p.nxt[b];
            }
            /* 因为所有序列都是30位的,所以不需要标注序列是否结尾了 */
        }

        public int find(int num) {
            //找到和num异或后最大的数
            Trie p = this;
            int ret = 0;

            for (int i = 30; i >= 0; --i) {
                int b = (num >> i) & 1;

                if (p.nxt[1 - b] != null) {
                    //要使异或值最大,则最好与num在该位取相反值
                    b = 1 - b;
                }
                p = p.nxt[b];

                ret = ret * 2 + b;
            }

            return ret;
        }
    }

    public int findMaximumXOR(int[] nums) {
        Trie root = new Trie();
        int ans = 0;

        for (int num : nums) {
            root.insert(num);
        }

        for (int num : nums) {
            ans = Math.max(ans, num ^ root.find(num));
        }

        return ans;
    }
}