สมมติว่าเรามีจำนวนอาร์เรย์และมีค่าสองค่า l และ r เราต้องหาจำนวนคู่ที่ดี นี่เป็นคู่ที่ดีคือคู่ (i, j) โดยที่ 0 <=i
ดังนั้น หากอินพุตเท่ากับ nums =[4,1,7,2] l =2 r =6 ผลลัพธ์จะเป็น 6 เพราะคู่ที่ดีคือ (1,0):1 XOR 4 =5, (1 ,2):1 XOR 7 =6, (1,3):1 XOR 2 =3, (0,3):4 XOR 2 =6, (0,2):4 XOR 7 =3,(2,3 ):7 XOR 2 =5.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
กำหนดฟังก์ชัน test() นี่จะใช้เวลา num, x
count :=แผนที่ที่มีความถี่ขององค์ประกอบเป็น nums
res :=0
ในขณะที่ x ไม่ใช่ศูนย์ให้ทำ
ถ้า x เป็นเลขคี่
res :=res + ผลรวมขององค์ประกอบทั้งหมดของ (count[a] * count[(x - 1) XOR a) สำหรับ a ทั้งหมดในการนับ
count :=map พร้อมคีย์ a/2 และค่า (count[a] + count[a XOR 1] สำหรับทุก a in count
x =ผลหารของ x/2
ผลตอบแทนของ res / 2
จากวิธีหลัก return test(nums, r + 1) - test(nums, l)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น
ตัวอย่าง
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 = 2
r = 6
print(solve(nums, l, r))
อินพุต
[4,1,7,2], 2, 6
ผลลัพธ์
6