ปัญหา
กำหนดอาร์เรย์ nums และค่า l, r หาจำนวน Nice Pairs (i, j) ที่ i < j และ l ≤ (nums[i] XOR nums[j]) ≤ r
ตัวอย่าง
nums = [4,1,7,2], l = 2, r = 6 → Output: 6
Pairs: (1,0)=5, (1,2)=6, (1,3)=3, (0,3)=6, (0,2)=3, (2,3)=5
อัลกอริทึม (Bitwise Trie / DP on Bits)
นับคู่ที่ XOR ≤ X โดยใช้ Frequency Count และ Bit DP:
- Count Frequency ของแต่ละค่าใน nums
- Process ทีละบิตจาก LSB ไป MSB
- ถ้า Bit ของ X เป็น 1: เพิ่มคู่ที่ XOR บิตนี้ = 0 (เหลือบิตต่ำกว่า ≤ X ที่เหลือ)
- Merge Frequency: รวมค่าที่ต่างกันแค่บิตปัจจุบัน (Divide by 2)
- Answer = Count(XOR ≤ r) - Count(XOR ≤ l-1)
ตัวอย่างโค้ด
from collections import Counter
def solve(nums, l, r):
def test(nums, x):
count = Counter(nums)
res = 0
while x:
if x & 1:
res += sum(count[a] * count[(x - 1) ^ a] for a in count)
count = Counter({a >> 1: count[a] + count[a ^ 1] for a in count})
x >>= 1
return res // 2
return test(nums, r + 1) - test(nums, l)
nums = [4,1,7,2]
l, r = 2, 6
print(solve(nums, l, r)) # 6
ความซับซ้อน
- Time: O((n + U) log U) โดย U = ค่าสูงสุดใน nums
- Space: O(U)