เราได้รับด้วยสตริงไบนารีสองสตริง สมมติว่า str_1 และ str_2 ที่มีการรวมกันของ 1 และ 0 และงานคือการสร้างชุดก่อน สมมติว่า "SET" ของการเรียงสับเปลี่ยนที่เป็นไปได้จากสตริง str_1 จากนั้นเราจะดำเนินการ XOR ของ องค์ประกอบในชุดด้วยสตริงไบนารี str_2 จากนั้นตรวจสอบว่า XOR คืนค่า 0 หรือไม่ ถ้าใช่ ก็ถือว่ากรณีอื่นละเว้น
ให้เราเข้าใจด้วยตัวอย่าง
ตัวอย่าง
ป้อนข้อมูล - string str_1 ="1111", string str_2 ="1111"
ผลลัพธ์ - จำนวนการเรียงสับเปลี่ยนแบบวนรอบที่มี XOR กับสตริงไบนารีอื่นๆ เป็น 0 คือ:4
คำอธิบาย - เราจะสร้างชุดโดยใช้สตริง str_2 และชุดจะเป็น {1111} ตอนนี้เราจะดำเนินการ XOR โดยใช้สตริง str_1 และตั้งค่ารูปแบบดังนั้น {1111} ^ “1111” =0 เนื่องจากเรามีองค์ประกอบที่คล้ายกัน 4 รายการในสตริง str_2 เราจึงสร้างการเรียงสับเปลี่ยนได้ 4 แบบ ดังนั้นผลลัพธ์จึงเป็น 4
ป้อนข้อมูล - string str_1 ="1101", string str_2 ="1101"
ผลลัพธ์ - จำนวนการเรียงสับเปลี่ยนแบบวนรอบที่มี XOR กับสตริงไบนารีอื่นๆ เป็น 0 คือ:1
คำอธิบาย - เราจะสร้างชุดโดยใช้สตริง str_2 และชุดจะเป็น {1101, 1110, 1011, 0111} ตอนนี้เราจะดำเนินการ XOR โดยใช้สตริง str_1 และตั้งค่ารูปแบบเช่น
{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)
- สร้างตัวแปรประเภทสตริง str และตั้งค่าเป็นการรวมกันของ str_1 และ str_2 จากนั้นคำนวณความยาวของสตริง str สร้างอาร์เรย์ของความยาวของสตริง str.
- เรียกใช้ฟังก์ชัน check() โดยส่งสตริง str และ array ไปยังฟังก์ชันเป็นอาร์กิวเมนต์
- ภายในฟังก์ชัน
- ประกาศตัวแปรสองตัวเริ่มต้นและสิ้นสุดและตั้งค่าเป็น 0
- คำนวณความยาวของสตริง
- เริ่มวนรอบ FOR จาก i จนถึงความยาวสำหรับ string -1 และตรวจสอบว่า i มากกว่า end แล้วตั้งค่า start เป็น i และสิ้นสุดเป็น i ตอนนี้เริ่มต้นในขณะที่สิ้นสุดน้อยกว่าความยาวของสตริงและ str[end-start] เท่ากับ str[end] และเพิ่มค่าของการสิ้นสุดโดย 1
- ตั้งค่า arr[i] เป็น end - เริ่มและลดจุดสิ้นสุดทีละ 1
- มิฉะนั้น ให้สร้างตัวแปรชั่วคราว temp และตั้งค่าเป็น i - start และตรวจสอบว่า arr[temp] น้อยกว่า end - i + 1 จากนั้นตั้งค่า arr[i] เป็น arr[temp] มิฉะนั้น ให้ตั้งค่าเริ่มต้นเป็น i และเริ่มต้นในขณะที่สิ้นสุดน้อยกว่าความยาวของสตริงและ str[end-start] เป็น str[end] จากนั้นเพิ่มจุดสิ้นสุดขึ้น 1 และตั้งค่า arr[i] เป็นสิ้นสุด - เริ่มและลดจุดสิ้นสุดทีละ 1 .
- เริ่มลูป FOR จาก i ถึง 1 จนถึงความยาวของสตริง str -1 และตรวจสอบว่า arr[i] เท่ากับความยาวของสตริง str_1 แล้วเพิ่มจำนวนขึ้น 1
- จำนวนคืน
- พิมพ์ผลลัพธ์
ตัวอย่าง
#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