Mô tả bài toán
Cho mảng nums và mảng truy vấn queries[i] = (xi, mi). Câu trả lời truy vấn i là max xi XOR nums[j] với nums[j] <= mi. Nếu không có phần tử nào <= mi, trả về -1.
Ví dụ
nums = [0,1,2,3,4], queries = [[3,1],[1,3],[5,6]] -> [3, 3, 7].
Giải thuật (Bitwise Trie + Offline)
- Sắp xếp
numsvàqueriestheolimit. - Duyệt bit từ 31 xuống 0, xây dựng tập tiền tố
prefixescủa các sốnums[j] >> kthỏanums[j] <= limit. - Với mỗi truy vấn, cố gắng đặt bit kết quả = 1 nếu tồn tại tiền tố phù hợp.
Triển khai Python
def solve(nums, queries):
m, n = len(nums), len(queries)
queries = sorted(((i, x, limit) for i, (x, limit) in enumerate(queries)), key=lambda x: x[2])
nums = sorted(nums)
res = [0] * n
for k in range(31, -1, -1):
prefixes = set()
j = 0
for i, x, limit in queries:
while j <= m - 1 and nums[j] <= limit:
prefixes.add(nums[j] >> k)
j += 1
if not prefixes:
res[i] = -1
else:
res[i] <<= 1
target = res[i] ^ 1
if (x >> k) ^ target in prefixes:
res[i] = target
return res
nums = [0, 1, 2, 3, 4]
queries = [[3, 1], [1, 3], [5, 6]]
print(solve(nums, queries))
Đầu vào
[0,1,2,3,4], [[3,1],[1,3],[5,6]]
Đầu ra
[3, 3, 7]