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

C++ คิวรีบน XOR ของ XORs ของทุก Subarray

เพื่อคำนวณ XOR ของทุก subarray ที่มีอยู่ในช่วงที่กำหนดและพิมพ์มัน ตัวอย่างเช่น:

Input : arr[] = { 4, 1, 2, 3, 5 }, Q = 3
Queries q1 = { 1, 2 }
q2 = { 2, 4 }
q3 = { 1, 4 }
Output : 0 2 0
คำอธิบาย : ตามที่ปัญหากำหนดว่าเราต้องหา XOR ของทุก subarray ในช่วงที่กำหนด ดังนั้นสำหรับ query 2 subarrays คือ: {1}, {2}, {3}, {1, 2}, {2, 3}, (1, 2, 3}
ดังนั้นคุณเห็นได้ว่าจำนวนครั้งที่องค์ประกอบปรากฏคือ:
1 ปรากฏ 3 ครั้ง
2 ปรากฏ 4 ครั้ง
3 ปรากฏ 3 ครั้ง
ตอนนี้เรารู้ว่าคุณสมบัติของ XOR คือ ตัวเลขที่ปรากฏจำนวนครั้งที่เป็นเลขคู่จะถูกตัดกันออกไป ดังนั้น 2 ถูกตัดออก และเหลือแค่ XOR ของ 3 และ 1 ซึ่งเป็นคำตอบของเรา

เราต้องสังเกตรูปแบบที่เกิดขึ้นในปัญหานี้ และนำไปใช้ตามนั้น

วิธีการหาคำตอบ

ในปัญหานี้ เราพยายามหา pattern ระหว่างที่มีอยู่ในปัญหา เมื่อเราเห็น pattern นั้น เรานำไปใช้ตามนั้นและตรวจสอบผลลัพธ์

ตัวอย่าง

โค้ด C++ สำหรับวิธีข้างต้น

#include <bits/stdc++.h>
using namespace std;

void ansQueries(int prefeven[], int prefodd[], int l, int r){
    if ((r - l + 1) % 2 == 0) // ถ้าจำนวนองค์ประกอบในช่วงเป็นเลขคู่
        cout << "0";
    else{
        if (l % 2 == 0) // ถ้า l เป็นเลขคู่
            cout << (prefeven[r] ^ prefeven[l - 1]) << "\n";
        else // ถ้า l เป็นเลขคี่
            cout << (prefodd[r] ^ prefodd[l - 1]) << "\n";
    }
}

int main(){
    int arr[] = {4, 1, 2, 3, 5};
    int n = sizeof(arr) / sizeof(int); // ขนาดของอาร์เรย์
    int l[] = {1, 2, 1}; // ดัชนีซ้ายของคิวรีที่กำหนด
    int r[] = {2, 4, 4}; // ดัชนีขวาของคิวรีที่กำหนด
    int q = sizeof(l) / sizeof(int); // จำนวนคิวรีที่ถาม
    int prefodd[n] = {0}, prefeven[n] = {0}; // prefix xor แยกสำหรับดัชนีคู่และคี่
    for (int i = 1; i <= n; i++){
        if ((i) % 2 == 0){ // ถ้า i เป็นคู่ เราเปลี่ยน prefeven
            prefeven[i] = arr[i - 1] ^ prefeven[i - 1];
            prefodd[i] = prefodd[i - 1];
        }else{
            prefeven[i] = prefeven[i - 1];
            prefodd[i] = prefodd[i - 1] ^ arr[i - 1];
        }
    }
    for (int i = 0; i < q; i++){
        ansQueries(prefeven, prefodd, l[i], r[i]);
    }
    return 0;
}

ผลลัพธ์

0 2 0

คำอธิบายโค้ด

ในวิธีนี้ เราสังเกตก่อนว่าถ้าขนาดของช่วงของเราเป็นเลขคู่ คำตอบของเราจะเป็นศูนย์ เพราะทุกตัวเลขปรากฏจำนวนครั้งที่เป็นเลขคู่เมื่อเราพิมพ์ subarray ทั้งหมด ดังนั้นการนำ XOR ของพวกเขาจะได้คำตอบเป็น 0 ตอนนี้สำหรับส่วนต่อไปที่ขนาดของช่วงเป็นเลขคี่ ในกรณีนี้ ตัวเลขที่ปรากฏจำนวนครั้งที่เป็นเลขคี่จะอยู่ในตำแหน่งคู่ในช่วงที่กำหนด และคำตอบของเราจะเป็น XOR ของตัวเลขที่ปรากฏในตำแหน่งคู่ในช่วงที่กำหนด สองอัน เราสร้าง prefix arrays สองอันที่มี XOR ของตำแหน่งสลับกัน prefeven มี XOR ของดัชนีคู่ทั้งหมด และ prefodd มี XOR ของดัชนีคี่ทั้งหมด ตอนนี้เมื่อเราแก้คิวรี เราเพียงแค่ต้องตรวจสอบว่า l ของเราเป็นคู่หรือคี่ และให้คำตอบตามนั้น

สรุป

ในบทช่วยสอนนี้ เราแก้ปัญหา Queries on XOR of XORs of all subarrays เรายังเรียนรู้โปรแกรม C++ สำหรับปัญหานี้และวิธีการแก้ปัญหาแบบเต็มรูปแบบ (ปกติ) ที่เราใช้แก้ปัญหานี้ เราสามารถเขียนโปรแกรมเดียวกันในภาษาอื่นๆ เช่น C, Java, Python และภาษาอื่นๆ ได้ เราหวังว่าบทช่วยสอนนี้จะเป็นประโยชน์