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

C++-এ বিটওয়াইজ OR যেন k হয় এমন ম্যাক্সিমাম লেন্থের সাবসেট


সমস্যা বিবরণ

নন-নেগেটিভ ইন্টিজার অ্যারে এবং একটি ইন্টিজার k দেওয়া আছে। বিটওয়াইজ OR যেন k হয় এমন ম্যাক্সিমাম লেন্থের সাবসেট বের করতে হবে।

উদাহরণ

ইনপুট: arr = [1, 4, 2], k = 3
আউটপুট: [1, 2]
ব্যাখ্যা: 1 OR 2 = 3। ২-এর চেয়ে বড় লেন্থের সাবসেট পাওয়া যাবে না।

অ্যালগরিদম

বিটওয়াইজ OR-এর প্রোপার্টি: 0|0=0, 1|0=1, 1|1=1।

  • k-এর বাইনারি রিপ্রেজেন্টেশনে যেসব বিট ০, সাবসেটের সব এলিমেন্টের সেসব বিটও ০ হতে হবে।
  • k-এর বিট ১ হলে সাবসেটে কমপক্ষে একটি এলিমেন্টের সেটা ১ থাকতে হবে।
  • ট্রাভার্স করলে: (arr[i] | k) == k হলে এলিমেন্টটি সাবসেটে নিব।
  • শেষে সাবসেটের OR করলে k হলে সাবসেটটি উত্তর, নাহলে "Subset does not exist"।

উদাহরণ

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

void getSubSet(int *arr, int n, int k){
    vector<int> v;
    for (int i = 0; i < n; i++) {
        if ((arr[i] | k) == k)
            v.push_back(arr[i]);
    }
    int ans = 0;
    for (int i = 0; i < v.size(); i++) {
        ans |= v[i];
    }
    if (ans != k) {
        cout << "Subset does not exist" << endl;
        return;
    }
    cout << "Result = ";
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    cout << endl;
}

int main(){
    int arr[] = { 1, 4, 2 };
    int k = 3;
    int n = sizeof(arr) / sizeof(arr[0]);
    getSubSet(arr, n, k);
    return 0;
}

আউটপুট

Result = 1 2

  1. বিটওয়াইজ AND দিয়ে 0 থেকে X পর্যন্ত রূপান্তরের সর্বোচ্চ ধাপ C++-এ

  2. C++-এ দেওয়া যোগফলের সাথে সর্বোচ্চ আকারের সাবসেট

  3. C++-এ N-এর চারটি ফ্যাক্টর যাদের যোগফল N এবং গুণফল সর্বোচ্চ

  4. C++-এ LCM যা গুণফলের সমান হয় এমন সর্বোচ্চ দৈর্ঘ্যের সাবঅ্যারে