ในปัญหานี้ เราได้รับเลขจำนวนเต็ม L และ R สองตัวที่แสดงถึงช่วง งานของเราคือค้นหา xor ขององค์ประกอบทั้งหมดภายในช่วง [L, R]
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล − L=3, R =6
คำอธิบาย − 3^4^5^6 =
ในการแก้ปัญหานี้ เราจะหา MSB ของ R โดย MSB ของคำตอบจะไม่เกิน R ตอนนี้ เราจะพบความเท่าเทียมกันของการนับจำนวนบิตตั้งแต่ 0 ถึง MSB
ในการหาจำนวนพาริตีสำหรับบิต ith เราจะเห็นว่าสถานะของบิต ith จะเปลี่ยนในทุกตัวเลขที่ 2 เหมือนกันสำหรับบิตทั้งหมดที่ตั้งไว้ในช่วง L ถึง R ในการทำเช่นนี้ จะเกิดสองกรณี -
กรณีที่ 1(i !=0) − ตรวจสอบบิตของ L หากตั้งค่าไว้ ให้ตรวจสอบการนับความเท่าเทียมกันของตัวเลขระหว่าง L และ L+2i และหากตั้งค่าบิต ith ของ L แล้ว L จะเป็นเลขคี่ การนับจะเป็นเลขคี่ ไม่เช่นนั้น จะเป็นเลขคู่ ตอนนี้ เราจะย้ายไปที่ R และกำหนดความเท่าเทียมกันของการนับจำนวนองค์ประกอบระหว่าง R-2i และ R แล้วทำตามวิธีเดียวกัน
ส่วนที่เหลือทั้งหมดจะไม่ถูกพิจารณาเนื่องจากจะสร้างจำนวนเต็มด้วยชุดบิต ith
กรณีที่ 2(i =0) − ที่นี่ เราจะต้องพิจารณากรณีต่อไปนี้ -
กรณีที่ 2.1 − L และ R ทั้งคู่เป็นเลขคี่ ให้นับจำนวนเต็มด้วยชุดบิตที่ 0 จะเป็น (R-L)/2+1 .
กรณีที่ 2.2 − มิฉะนั้น การนับจะถูกปัดเศษเป็นตัวเลข (R-L+1)/2 .
ตัวอย่าง
โปรแกรมแสดงการใช้งานโซลูชันของเรา
#include <iostream> using namespace std; int findMSB(int x) { int ret = 0; while ((x >> (ret + 1)) != 0) ret++; return ret; } int XOREleInRange(int L, int R) { int max_bit = findMSB(R); int mul = 2; int ans = 0; for (int i = 1; i <= max_bit; i++) { if ((L / mul) * mul == (R / mul) * mul) { if (((L & (1 << i)) != 0) && (R - L + 1) % 2 == 1) ans += mul; mul *= 2; continue; } bool oddCount = 0; if (((L & (1 << i)) != 0) && L % 2 == 1) oddCount = (oddCount ^ 1); if (((R & (1 << i)) != 0) && R % 2 == 0) oddCount = (oddCount ^ 1); if (oddCount) ans += mul; mul *= 2; } int zero_bit_cnt = zero_bit_cnt = (R - L + 1) / 2; if (L % 2 == 1 && R % 2 == 1) zero_bit_cnt++; if (zero_bit_cnt % 2 == 1) ans++; return ans; } int main(){ int L = 1, R = 4; cout<<"The XOR of all element within the range ("<<L<<", "<<R<<") is : "<<XOREleInRange(L, R); return 0; }
ผลลัพธ์
The XOR of all element within the range (1, 4) is : 4