C++ 中計算與其他二進位制字串異或結果為 0 的迴圈排列的數量


我們給出兩個二進位制字串,假設為 str_1 和 str_2,它們包含 1 和 0 的組合。任務是首先形成一個集合,假設為“SET”,該集合包含字串 str_1 的所有不同排列,然後我們將集合中的元素與二進位制字串 str_2 執行異或運算,然後檢查異或結果是否為 0。如果是,則考慮這種情況,否則忽略它。

讓我們透過例子來理解。

例如

輸入 - 字串 str_1 = "1111",字串 str_2 = "1111"

輸出 - 與其他二進位制字串異或結果為 0 的迴圈排列的數量為:4

解釋 - 我們將使用字串 str_2 建立集合,集合將為 {1111}。現在,我們將使用字串 str_1 和形成的集合執行異或運算,即 {1111} ^ “1111” = 0。由於字串 str_2 中有 4 個相同的元素,因此我們可以形成 4 個不同的排列,因此輸出為 4。

輸入 - 字串 str_1 = "1101",字串 str_2 = "1101"

輸出 - 與其他二進位制字串異或結果為 0 的迴圈排列的數量為:1

解釋 - 我們將使用字串 str_2 建立集合,集合將為 {1101, 1110, 1011, 0111}。現在,我們將使用字串 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 和陣列作為引數傳遞給函式。
  • 在函式內部
    • 宣告兩個變數 start 和 end 並將其設定為 0
    • 計算字串的長度。
    • 從 i 到字串長度 -1 開始 FOR 迴圈,並檢查 IF i 大於 end,則將 start 設定為 i,將 end 設定為 i。現在開始 While end 小於字串長度 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 小於字串長度 AND str[end-start] 為 str[end],然後將 end 加 1 並將 arr[i] 設定為 end - start 並將 end 減 1。
  • 從 i 到 1 開始 FOR 迴圈,直到字串 str 長度 -1,並檢查 IF 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

更新於: 2021-01-29

588 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告