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

XOR ของ XOR ย่อยทั้งหมดใน C++


ในปัญหานี้ เราจะได้รับอาร์เรย์ของ n องค์ประกอบ งานของเราคือพิมพ์ XOR ของ XOR อาร์เรย์ย่อยที่เป็นไปได้ทั้งหมด (ตามลำดับ) ที่สร้างขึ้นจากองค์ประกอบของอาร์เรย์

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

ป้อนข้อมูล − อาร์เรย์ ={1, 3, 6, 8}

ผลผลิต − 0

คำอธิบาย

(1) ^ (3) ^ (6) ^ (8) ^ (1^3) ^ (3^6)^ (6^8) ^ (1^3^6) ^ (3^6^8) ^ (1^3^6^8)

ในการแก้ปัญหานี้ วิธีแก้ไขง่ายๆ อาจวนซ้ำในอาร์เรย์ย่อยทั้งหมดและค้นหา xors แต่นี่เป็นแนวทางที่ไม่มีประสิทธิภาพ วิธีที่ดีกว่าคือการนับความถี่ของแต่ละองค์ประกอบของอาร์เรย์ที่เกิดขึ้นในอาร์เรย์ย่อยทั้งหมด และใช้คุณสมบัติของ xor − xor ขององค์ประกอบ จำนวนครั้งคู่เท่ากับ 0 . เมื่อใช้สิ่งนี้ เราจะละเว้นค่าทั้งหมดที่เกิดขึ้นเป็นจำนวนคู่ในรายการอาร์เรย์ย่อย ตอนนี้องค์ประกอบที่มีความถี่การเกิดคี่จะถูกนำมาพิจารณา เช่น xor ขององค์ประกอบที่มีความถี่การเกิดคี่จะให้ผลลัพธ์สุดท้าย

ในการค้นหาการเกิดขึ้นของแต่ละองค์ประกอบของอาร์เรย์ในอาร์เรย์ย่อย เราจะใช้สูตรนี้ (i+1)*(n-i) .

เมื่อใช้สูตรนี้ เราจะหาความถี่ของการเกิดขึ้นของแต่ละองค์ประกอบ แล้วพิจารณาองค์ประกอบเหล่านั้นที่มีความถี่คี่ xor เพื่อให้ได้ผลลัพธ์สุดท้าย

ตัวอย่าง

โปรแกรมแสดงการใช้งานโซลูชันของเรา

#include <iostream>
using namespace std;
   int xorSubarrayXors(int arr[], int N){
   int result = 0;
   for (int i = 0; i < N; i++){
      int freqency = (i + 1) * (N - i);
      if (freqency % 2 == 1)
         result ^= arr[i];
   }
   return result;
}
int main() {
   int arr[] = {1, 3, 6, 8};
   int N = sizeof(arr) / sizeof(arr[0]);
   cout<<"The xor of all subarray xors is : "<<xorSubarrayXors(arr, N);
   return 0;
}

ผลลัพธ์

The xor of all subarray xors is : 0