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 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.