Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมทำให้ XOR ของทุก Segment ขนาด k เท่ากาศูนย์ใน Python

ปัญหา

อาร์เรย์ nums และค่า k XOR ของ Segment [left, right] = XOR ของ Element ทุกตัวในช่วง หาจำนวน Element น้อยที่สุดที่ต้องเปลี่ยน ให้ XOR ของทุก Segment ขนาด k = 0

ตัวอย่าง

nums = [3,4,5,2,1,7,3,4,7], k = 3 → Output: 3

แก้: เปลี่ยน Index 2,3,4 → [3,4,7,3,4,7,3,4,7] ทุก Segment ขนาด 3 XOR = 0

อัลกอริทึม (DP on XOR Values per Position Mod k)

  1. กลุ่ม Element ตาม Index mod k → k Groups
  2. แต่ละ Group ต้องมีค่าเดียวกันทั้งหมด (เพื่อ XOR Segment = 0)
  3. DP: dp[x] = จำนวน Element ที่เก็บได้มากที่สุด ถ้า XOR ของค่าที่เลือก = x
  4. สำหรับแต่ละ Group: ลองเลือกค่า v ที่มีใน Group → New DP[x XOR v] = Max(DP[x] + Count[v])
  5. คำตอบ = n - dp[0]

ตัวอย่างโค้ด

def solve(nums, k):
    LIMIT = 2**10  # 1024
    temp = [[0 for _ in range(LIMIT)] for _ in range(k)]
    
    for i, x in enumerate(nums):
        temp[i % k][x] += 1
    
    dp = [-2000 for _ in range(LIMIT)]
    dp[0] = 0
    
    for row in temp:
        maxprev = max(dp)
        new_dp = [maxprev for _ in range(LIMIT)]
        for i, cnt in enumerate(row):
            if cnt > 0:
                for j, prev in enumerate(dp):
                    new_dp[i ^ j] = max(new_dp[i ^ j], prev + cnt)
        dp = new_dp
    
    return len(nums) - dp[0]

nums = [3,4,5,2,1,7,3,4,7]
k = 3
print(solve(nums, k))  # Expected: 3 (Note: Example output shows -9, likely bug in original)

หมายเหตุ

ตัวอย่าง Output ในต้นฉบับแสดง -9 ซึ่งไม่ถูกต้อง (ควรเป็น 3) โค้ดข้างต้นแก้ไข Logic ให้ถูกต้อง

ความซับซ้อน

  • Time: O(k × LIMIT²) ≈ O(k × 1024²)
  • Space: O(LIMIT)