Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 다른 이진 문자열과 XOR이 0인 순환 순열의 수

<시간/>

1과 0의 조합을 포함하는 str_1과 str_2라는 두 개의 이진 문자열이 주어지고 작업은 먼저 문자열 str_1에서 가능한 다른 순열의 "SET"이라고 가정해 봅시다. 이진 문자열 str_2로 집합의 요소를 찾은 다음 XOR이 0을 반환하는지 여부를 확인합니다. 그렇다면 그 경우를 고려하고 무시하십시오.

예를 들어 이해합시다.

예를 들어

입력 - 문자열 str_1 ="1111", 문자열 str_2 ="1111"

출력 - 다른 이진 문자열이 0인 XOR이 있는 순환 순열의 수는 다음과 같습니다. 4

설명 - 문자열 str_2를 사용하여 집합을 만들고 집합은 {1111}이 됩니다. 이제 문자열 str_1을 사용하여 XOR 연산을 수행하고 {1111} ^ "1111" =0으로 설정합니다. 문자열 str_2에 4개의 유사한 요소가 있으므로 4개의 다른 순열을 형성할 수 있으므로 출력은 4입니다.

입력 - 문자열 str_1 ="1101", 문자열 str_2 ="1101"

출력 - 다른 이진 문자열이 0인 XOR이 있는 순환 순열의 수는 다음과 같습니다. 1

설명 - 문자열 str_2를 사용하여 집합을 생성하고 집합은 {1101, 1110, 1011, 0111}이 됩니다. 이제 우리는 문자열 str_1을 사용하여 XOR 연산을 수행하고 형식화된 설정 즉,

^ 1101 =0

{1110} ^ 1101 0이 아님

^ 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()를 호출합니다.
  • 함수 내부
    • 두 개의 변수 시작과 끝을 선언하고 0으로 설정
    • 문자열의 길이를 계산합니다.
    • i에서 문자열 -1의 길이까지 FOR 루프를 시작하고 IF i가 end보다 큰지 확인한 다음 start를 i로 설정하고 end를 i로 설정합니다. 이제 시작하는 동안 end는 string의 길이보다 작고 str[end-start]는 str[end]와 같고 end의 값을 1만큼 증가
    • 이제 arr[i]를 끝으로 설정 - 시작하고 끝을 1씩 감소
    • 또는 임시 변수 temp를 생성하여 i - start로 설정하고 IF arr[temp]가 end - i + 1보다 작은지 확인한 다음 arr[i]를 arr[temp]로 설정합니다. 그렇지 않으면 시작을 i로 설정하고 시작 WHILE 끝이 문자열 길이보다 짧고 str[end-start]를 str[end]로 지정한 다음 끝을 1씩 증가시키고 arr[i]를 끝으로 설정 - 시작하고 끝을 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