Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

XOR ขององค์ประกอบทั้งหมดในช่วงที่กำหนด [L, R] ใน C++


ในปัญหานี้ เราได้รับเลขจำนวนเต็ม 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