คำชี้แจงปัญหา
กำหนดอาร์เรย์ของจำนวนเต็มที่ไม่ติดลบและจำนวนเต็ม k ให้ค้นหาเซตย่อยของความยาวสูงสุดที่มีระดับบิต OR เท่ากับ k
ตัวอย่าง
If given input array is = [1, 4, 2] and k = 3 then output is: [1, 2] The bitwise OR of 1 and 2 equals 3. It is not possible to obtain a subset of length greater than 2.
อัลกอริทึม
ด้านล่างนี้เป็นคุณสมบัติของระดับบิต OR -
0 OR 0 = 0 1 OR 0 = 1 1 OR 1 = 1
-
สำหรับตำแหน่งทั้งหมดในการแสดงเลขฐานสองของ k ที่มีบิตเท่ากับ 0 ตำแหน่งที่สอดคล้องกันในการแทนค่าไบนารีขององค์ประกอบทั้งหมดในเซตย่อยที่เป็นผลลัพธ์ควรเป็น 0
-
ในทางกลับกัน สำหรับตำแหน่งใน k ที่มีบิตเท่ากับ 1 จะต้องมีองค์ประกอบอย่างน้อยหนึ่งตัวที่มี 1 อยู่ในตำแหน่งที่สอดคล้องกัน องค์ประกอบที่เหลือสามารถมี 0 หรือ 1 ในตำแหน่งนั้น ไม่สำคัญ
-
ดังนั้น เพื่อให้ได้เซตย่อยที่เป็นผลลัพธ์ ให้สำรวจอาร์เรย์เริ่มต้น ขณะตัดสินใจว่าองค์ประกอบควรอยู่ในเซตย่อยที่เป็นผลลัพธ์หรือไม่ ให้ตรวจสอบว่ามีตำแหน่งใดในการแทนค่าไบนารีของ k ที่เป็น 0 และตำแหน่งที่สอดคล้องกันในองค์ประกอบนั้นคือ 1 หากมีตำแหน่งดังกล่าวอยู่ ให้เพิกเฉยต่อองค์ประกอบนั้น มิฉะนั้นจะรวมไว้ในเซตย่อยที่เป็นผลลัพธ์
-
จะทราบได้อย่างไรว่ามีตำแหน่งอยู่ในการแสดงไบนารีของ k ซึ่งเป็น 0 และตำแหน่งที่สอดคล้องกันในองค์ประกอบคือ 1? เพียงแค่ใช้ OR ระดับบิตของ k และองค์ประกอบนั้น หากมันไม่เท่ากับ k แสดงว่ามีตำแหน่งดังกล่าวอยู่และองค์ประกอบนั้นจะต้องถูกละเว้น หากค่าระดับบิต OR เท่ากับ k ให้รวมองค์ประกอบปัจจุบันในชุดย่อยที่เป็นผลลัพธ์
-
ขั้นตอนสุดท้ายคือการพิจารณาว่ามีอย่างน้อยหนึ่งองค์ประกอบที่มี 1 อยู่ในตำแหน่งที่มี 1 อยู่ในตำแหน่งที่สอดคล้องกันใน k
-
เพียงคำนวณค่าบิต OR ของเซตย่อยที่เป็นผลลัพธ์ ถ้ามันเท่ากับ k นี่คือคำตอบสุดท้าย มิฉะนั้นจะไม่มีชุดย่อยที่ตรงตามเงื่อนไข
ตัวอย่าง
#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