Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

จำนวนการเปลี่ยนลำดับแบบวนรอบที่มี XOR กับสตริงไบนารีอื่นเป็น 0 ใน C++


เราได้รับด้วยสตริงไบนารีสองสตริง สมมติว่า 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