<p>Given an integer array <code>nums</code>, return <em>the maximum result of </em><code>nums[i] XOR nums[j]</code>, where <code>0 &lt;= i &lt;= j &lt; n</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> nums = [3,10,5,25,2,8]
<strong>Output:</strong> 28
<strong>Explanation:</strong> The maximum result is 5 XOR 25 = 28.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> nums = [14,70,53,83,49,91,36,80,92,51,66,70]
<strong>Output:</strong> 127
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= nums.length &lt;= 2 * 10<sup>5</sup></code></li>
	<li><code>0 &lt;= nums[i] &lt;= 2<sup>31</sup> - 1</code></li>
</ul>

class Node:
    def __init__(self):
        self.children = [None, None]
        self.num_flg = False

class Trie:
    def __init__(self):
        self.root = Node()

    def insert(self, num):
        curr = self.root
        for i in range(len(num)):
            if curr.children[num[i]] is None:
                curr.children[num[i]] = Node()
            curr = curr.children[num[i]]
        curr.num_flg = True
    
    def maximumXOR(self, num):
        res = []
        
        curr = self.root
        for i in range(len(num)):
            if curr.children[1 - num[i]] is not None:
                curr = curr.children[1 - num[i]]
                res.append(1)
            else:
                curr = curr.children[num[i]]
                res.append(0)
        
        val = 0
        for i in range(len(res)):
            val += res[i] * 2 ** (len(res) - 1 - i)
        return val

class Solution:
    def create_binary_num(self, num):
        res= []
        while num > 0:
            res.append(num % 2)
            num = num // 2
        return res[::-1]
    
    def findMaximumXOR(self, nums: List[int]) -> int:
        storage = Trie()
        binary_nums = []
        
        max_len = len(self.create_binary_num(max(nums)))
        for i in range(len(nums)):
            binary_num = self.create_binary_num(nums[i])
            storage.insert([0] * (max_len - len(binary_num)) + binary_num)
            binary_nums.append(binary_num)
        
        res = 0
        for num in binary_nums:
            val = storage.maximumXOR(num)
            if val > res:
                res = val
        
        return res
555215