<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 Solution:
    def findMaximumXOR(self, nums: List[int]) -> int:
        # Define the maximum number of bits in the binary representation of the numbers
        L = len(bin(max(nums))) - 2
        # Pad the binary representation of each number with zeros to ensure they are all the same length
        nums = [[(x >> i) & 1 for i in range(L)][::-1] for x in nums]

        max_xor = 0
        trie = {}

        # Function to insert a number into the trie
        def insert(num):
            node = trie
            for bit in num:
                if bit not in node:
                    node[bit] = {}
                node = node[bit]
            node['#'] = True

        # Function to find the maximum XOR of a number with any number in the trie
        def find_max_xor(num):
            node = trie
            current_xor = 0
            for bit in num:
                opposite_bit = 1 - bit
                if opposite_bit in node:
                    current_xor = (current_xor << 1) | 1
                    node = node[opposite_bit]
                else:
                    current_xor = current_xor << 1
                    node = node[bit]
            return current_xor

        # Insert numbers into the trie and update the maximum XOR value
        for num in nums:
            insert(num)
            max_xor = max(max_xor, find_max_xor(num))

        return max_xor
664790