# Time: O(nlogn + mlogm + nlogk + mlogk), k is max(max(nums), max(xi)) # Space: O(nlogk) class Trie(object): def __init__(self, bit_length): self.__root = {} self.__bit_length = bit_length def insert(self, num): node = self.__root for i in reversed(xrange(self.__bit_length)): curr = (num>>i) & 1 if curr not in node: node[curr] = {} node = node[curr] def query(self, num): if not self.__root: return -1 node, result = self.__root, 0 for i in reversed(xrange(self.__bit_length)): curr = (num>>i) & 1 if 1^curr in node: node = node[1^curr] result |= 1<