समस्या कथन
गैर-ऋणात्मक पूर्णांकों की एक सरणी और एक पूर्णांक k को देखते हुए, बिटवाइज़ या 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 है? बस बिटवाइज या k का और वह तत्व लें। यदि यह k के बराबर नहीं है, तो ऐसी स्थिति होती है और तत्व को अनदेखा करना पड़ता है। यदि उनका बिटवाइज़ या k के बराबर है, तो परिणामी उपसमुच्चय में वर्तमान तत्व शामिल करें।
-
अंतिम चरण यह निर्धारित करना है कि k में संबंधित स्थिति में 1 के साथ 1 के साथ कम से कम एक तत्व है या नहीं।
-
बस बिटवाइज़ या परिणामी सबसेट की गणना करें। यदि यह 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