हमें दो बाइनरी स्ट्रिंग दी गई हैं मान लीजिए str_1 और str_2 जिनमें 1 और 0 का संयोजन है और कार्य सबसे पहले str_1 स्ट्रिंग से संभव विभिन्न क्रमपरिवर्तनों का सेट "SET" बनाना है और फिर सेट में तत्वों का बाइनरी स्ट्रिंग str_2 के साथ XOR ऑपरेशन करना है और फिर चेक करना है कि क्या XOR 0 लौटाता है या नहीं। यदि हाँ, तो मामले पर विचार करें अन्यथा अनदेखा करें।
उदाहरणों से समझते हैं।
उदाहरण के लिए
इनपुट - string str_1 = "1111", string str_2 = "1111"
आउटपुट - दूसरी बाइनरी स्ट्रिंग के साथ XOR 0 होने वाली चक्रीय क्रमपरिवर्तनों की संख्या: 4
व्याख्या - हम string str_2 का उपयोग करके सेट बनाएंगे और सेट {1111} होगा। अब हम string str_1 और बने सेट का उपयोग करके XOR ऑपरेशन करेंगे तो {1111} ^ "1111" = 0। चूंकि string str_2 में 4 समान तत्व हैं इसलिए हम 4 अलग-अलग क्रमपरिवर्तन बना सकते हैं इसलिए आउटपुट 4 है।
इनपुट - string str_1 = "1101", string str_2 = "1101"
आउटपुट - दूसरी बाइनरी स्ट्रिंग के साथ XOR 0 होने वाली चक्रीय क्रमपरिवर्तनों की संख्या: 1
व्याख्या - हम string str_2 का उपयोग करके सेट बनाएंगे और सेट {1101, 1110, 1011, 0111} होगा। अब हम string str_1 और बने सेट का उपयोग करके XOR ऑपरेशन करेंगे यानी
{1101} ^ 1101 = 0
{1110} ^ 1101 0 के बराबर नहीं
{1011} ^ 1101 0 के बराबर नहीं
{0111} ^ 1101 0 के बराबर नहीं
जैसा कि हम देख सकते हैं हमने केवल एक 0 प्राप्त किया इसलिए गिनती 1 है।
नीचे दिए गए प्रोग्राम में उपयोग किया गया दृष्टिकोण
- दो बाइनरी स्ट्रिंग इनपुट करें मान लीजिए str_1 और str_2 और उन्हें आगे की प्रोसेसिंग के लिए फ़ंक्शन cyclic_permutation() में पास करें।
- परिणाम संग्रहीत करने के लिए एक अस्थायी वेरिएबल बनाएं और str_2 को str_2 + str_2 सेट करें और फिर str_2 को str_2.substr(0, str_2.size()-1) सेट करें।
- string प्रकार का एक वेरिएबल str बनाएं और इसे str_1 और str_2 के संयोजन पर सेट करें फिर string str की लंबाई की गणना करें। string str की लंबाई की एक सरणी बनाएं।
- string str और सरणी को तर्क के रूप में पास करके फ़ंक्शन check() को कॉल करें।
- फ़ंक्शन के अंदर
- दो वेरिएबल start और end घोषित करें और उन्हें 0 पर सेट करें
- string की लंबाई की गणना करें।
- string -1 की लंबाई तक i से FOR लूप शुरू करें और चेक करें IF i end से बड़ा है तो start को i और end को i सेट करें। अब While end string की लंबाई से कम है AND str[end-start] str[end] के बराबर है तो end के मान को 1 से बढ़ाएं
- अब arr[i] को end - start सेट करें और end को 1 से घटाएं
- अन्यथा, एक अस्थायी वेरिएबल temp बनाएं और इसे i - start सेट करें और चेक करें IF arr[temp] end - i + 1 से कम है तो arr[i] को arr[temp] सेट करें। अन्यथा, start को i सेट करें और WHILE end string की लंबाई से कम है AND str[end-start] str[end] के रूप में शुरू करें तो end को 1 से बढ़ाएं और arr[i] को end - start सेट करें और end को 1 से घटाएं।
- string str की लंबाई -1 तक i से 1 तक FOR लूप शुरू करें और चेक करें IF arr[i] str_1 की लंबाई के बराबर है तो count को 1 से बढ़ाएं
- count लौटाएं
- परिणाम प्रिंट करें
उदाहरण
#include <bits/stdc++.h> using namespace std; void check(string str, int arr[]) { int start = 0, end = 0; int len = str.length(); for (int i = 1; i <= len - 1; i++) { if (i > end) { start = i; end = i; while (end < len && str[end - start] == str[end]) { end++; } arr[i] = end - start; end--; } else { int temp = i - start; if (arr[temp] < end - i + 1) { arr[i] = arr[temp]; } else { start = i; while (end < len && str[end - start] == str[end]) { end++; } arr[i] = end - start; end--; } } } } int cyclic_permutation(string str_1, string str_2) { int count = 0; str_2 = str_2 + str_2; str_2 = str_2.substr(0, str_2.size() - 1); string str = str_1 + "$" + str_2; int len = str.length(); int arr[len]; check(str, arr); for (int i = 1; i <= len - 1; i++) { if (arr[i] == str_1.length()) { count++; } } return count; } int main() { string str_1 = "1111"; string str_2 = "1111"; cout << "Count of cyclic permutations having XOR with other binary string as 0 are: " << cyclic_permutation(str_1, str_2); return 0; } यदि हम उपरोक्त कोड चलाते हैं तो यह निम्नलिखित आउटपुट उत्पन्न करेगा -
आउटपुट
Count of cyclic permutations having XOR with other binary string as 0 are: 4