কম্পিউটার টিউটোরিয়াল

C++-এ সাবঅ্যারের XOR

এই সমস্যায়, আমাদের একটি arr[] এবং কিছু কোয়েরি দেওয়া আছে যা অ্যারেতে L থেকে R পর্যন্ত রেঞ্জ। আমাদের কাজ হল L থেকে R-এর মধ্যে সাবঅ্যারের XOR প্রিন্ট করা।

একটি উদাহরণ দিয়ে সমস্যাটি বুঝতে পারি,

ইনপুট — array = {1, 4, 5, 7, 2, 9}, L = 1, R = 5

আউটপুট —

ব্যাখ্যা — 4^5^7^2^9

  • এই সমস্যাটি সমাধান করতে, আমরা একটি অ্যারে তৈরি করব নিচের অবলोकন দিয়ে,
  • আমরা একাধিক বিট XOR করব, যদি ১-এর সংখ্যা বিজোড় হয়, রেজাল্ট ১ হবে অন্যথায় ০।

এখন, আমরা একটি টু-ডাইমেনশনাল অ্যারে count তৈরি করব যা ১-এর কাউন্ট স্টোর করবে। count[i][j] ভ্যালু হল i-j পজিশনের জন্য ১-এর কাউন্ট যেটি সাবঅ্যারে arr[0..j]-এ i-তম বিট পজিশনে ১-এর সংখ্যা। সাব-অ্যারে arr[L..R]-এর সব বিটের ১-এর সংখ্যা count অ্যারে দিয়ে বের করা যাবে। arr[L...R] বের করার ফর্মুলা = count[i][R] - count[i][L-1]। যদি ১-এর সংখ্যা বিজোড় হয়, তবে i-তম বিট রেজাল্টে সেট হবে। ফাইনাল রেজাল্ট পাওয়া যাবে ২-এর পাওয়ার যোগ করে যা i-তম বিট সেট বিট হলে।

উদাহরণ

আমাদের সমাধানের ইমপ্লিমেন্টেশন দেখানোর প্রোগ্রাম,

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

void preProcessArray(int arr[], int n, vector<vector<int> >& cnt) {
    int i, j;
    for (i = 0; i < 32; i++) {
        cnt[i][0] = 0;
        for (j = 0; j < n; j++) {
            if (j > 0) {
                cnt[i][j] = cnt[i][j - 1];
            }
            if (arr[j] & (1 << i))
                cnt[i][j]++;
        }
    }
}

int findXORofSubArray(int L, int R, const vector<vector<int> > count) {
    int result = 0;
    int noOfOnes;
    int i, j;
    for (i = 0; i < 32; i++) {
        noOfOnes = count[i][R] - ((L > 0) ? count[i][L - 1] : 0);
        if (noOfOnes & 1) {
            result += (1 << i);
        }
    }
    return result;
}

int main() {
    int arr[] = {1, 4, 5, 7, 2, 9};
    int n = sizeof(arr) / sizeof(arr[0]);
    vector<vector<int> > count(32, vector<int>(n));
    preProcessArray(arr, n, count);
    int L = 1;
    int R = 5;
    cout << "The XOR of SubArray: " << findXORofSubArray(L, R, count);
    return 0;
}

আউটপুট

The XOR of SubArray: 13
  1. 4Sum সমস্যা C++-এ

  2. C++-এ সাবঅ্যারে ফ্লিপ করে ০-এর সংখ্যা সর্বাধিক করা

  3. সি++ প্রোগ্রাম: অ্যারেতে ন্যূনতম XOR ভ্যালু পেয়ার খুঁজে বের করা

  4. C++-এ static_cast