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

C++-এ দেওয়া রেঞ্জ [L, R]-এ সব এলিমেন্টের XOR

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

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

ইনপুট — L=3, R=6

ব্যাখ্যা — 3^4^5^6 =

এই সমস্যাটি সমাধান করতে, আমরা R-এর MSB (Most Significant Bit) বের করব। আউটপুটের MSB R-এর চেয়ে বড় হবে না। এখন, আমরা 0 থেকে MSB পর্যন্ত বিটের সংখ্যার প্যারিটি (odd/even) বের করব।

এখন, i-তম বিটের প্যারিটি কাউন্ট বের করতে, আমরা দেখতে পাই যে i-তম বিটের স্টেট প্রতি 2^i নাম্বারে পরিবর্তন হয়। একই কথা রেঞ্জ L থেকে R-এ সেট থাকা সব i-তম বিটের জন্যও সত্য। এটি করলে দুটি কেস উদ্ভূত হয় —

কেস ১ (i != 0) — L-এর i-তম বিট চেক করুন। যদি সেট থাকে, L এবং L+2^i-এর মধ্যে নাম্বারের প্যারিটি কাউন্ট চেক করুন। এবং যদি L-এর i-তম বিট সেট থাকে, তবে L বিজোড়, তাহলে কাউন্ট বিজোড় হবে অন্যথায় জোড়। এখন, আমরা R-এ যাব, এবং R-2^i এবং R-এর মধ্যে এলিমেন্ট সংখ্যার প্যারিটি নির্ধারণ করব এবং একই পদ্ধতি ফলো করব।

বাকি সব ইন্টিজার বিবেচনা করা হয় না কারণ তারা i-তম বিট সেট থাকা ইন্টিজারের জোড় সংখ্যা জেনারেট করবে।

কেস ২ (i = 0) — এখানে, আমাদের নিচের কেসগুলো বিবেচনা করতে হবে —

কেস ২.১ — L এবং R উভয়ই বিজোড়, 0th-বিট সেট থাকা ইন্টিজারের সংখ্যা হবে (R-L)/2+1।

কেস ২.২ — অন্যথায়, কাউন্ট হবে (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 = (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
  1. C++-এ দেওয়া নোডের সাব-ট্রির সব নোডের XOR

  2. সি++ প্রোগ্রাম: দিয়ে থাকা স্ট্রিং-এ "1(0+)1" প্যাটার্নের সব.matches খুঁজে বের করা

  3. C++-এ অ্যারের সব উপাদানে XOR অপারেশন প্রয়োগ করে অ্যারে যোগফল ন্যূনীকরণ

  4. পাইথন - নির্দিষ্ট পরিসরে তালিকার সব সম উপাদান পরীক্ষা