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

C++에서 특정 XOR 값을 갖는 부분집합의 개수 세기

<시간/>

양의 정수와 일치하는 값을 포함하는 배열 arr[ ]이 제공됩니다. 목표는 XOR =match가 있는 요소를 포함하는 rr[]의 하위 집합을 찾는 것입니다.

예를 들어

입력

arr[] = {4, 2, 8, 10} match=12

출력

Count of number of subsets having a particular XOR value are: 2

설명

Subsets of arr with XOR of elements as 0 are −
[ 4,8 ], [4,2,10]

입력

arr[] = {3,5,2,7} match=5

출력

Count of number of subsets having a particular XOR value are− 2

설명

ubsets of arr with XOR of elements as 0 are−
[ 5 ], [2,7]

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다. -

이 접근 방식에서는 동적 프로그래밍 솔루션을 사용합니다. 배열 arr_2[][]는 arr_2[ i ][ j ]가 arr[ 0에서 i−1 ]까지의 부분집합에서 요소의 XOR 값을 갖도록 인덱스 i,j에 값을 포함합니다. 초기 값 arr_2[0][0]을 1로 취합니다. 빈 집합 XOR은 1입니다. Set arr_2[i][j] =arr_2[i−1][j] + arr_2[i−1][j ^ arr[i-1]], 부분 집합 arr[0 ~ i-2]가 j로 XOR을 가진다면 부분 집합 arr[0 ~ i-1]도 XOR j를 가집니다. 또한 부분 집합 arr[0 to i−2]가 j^arr[i]로 XOR을 갖는다면 부분 집합 arr[0 to i−1]도 j ^ arr[i−1] ^ arr[i-1]로 XOR j를 갖습니다. .결과는 arr_2[ size ][ match ]에서 찾을 수 있습니다.

  • 정수 배열 arr[]를 가져옵니다.

  • 변수 일치를 정수로 가져옵니다.

  • 함수 subset_XOR(int arr[], int size, int match)는 입력 배열과 그 길이를 취하고 특정 XOR 값을 갖는 부분 집합의 개수를 반환합니다.

  • 처음에 가장 높은 값 =arr[0]을 취합니다. 이제 for 루프를 사용하여 전체 arr[]을 탐색하고 최대값을 가장 높은 값으로 찾습니다.

  • temp =(1 <<(int)(log2(highest) + 1) ) − 1을 가능한 최대 XOR 값으로 계산합니다.

  • 배열 arr_2[size+1][temp+1]를 ​​사용하여 XOR을 저장합니다.

  • for 루프를 사용하여 전체 arr_2를 0으로 초기화합니다.

  • arr_2[0][0] =1로 설정합니다.

  • for 루프를 i=0에서 i<=size로, j=0에서 j<=size로 설정하고 temp_2 =arr_2[i−1][j ^ arr[i−1]]을 설정하고 arr_2[i][j를 설정합니다. ] =arr_2[i−1][j] + temp_2.

  • 두 for 루프의 끝에 특정 XOR 값을 가진 부분 집합의 수로 arr_2[size][match]가 있습니다.

  • 결과로 rr_2[size][match]를 반환합니다.

예시

#include<bits/stdc++.h>
using namespace std;
int subset_XOR(int arr[], int size, int match){
   int highest = arr[0];
   for (int i = 1; i < size; i++){
      if(arr[i] > highest){
         highest = arr[i];
      }
   }
   int temp = (1 << (int)(log2(highest) + 1) ) − 1;
   if( match > temp){
      return 0;
   }
   int arr_2[size+1][temp+1];
   for (int i = 0; i<= size; i++){
      for (int j = 0; j<= temp; j++){
         arr_2[i][j] = 0;
      }
   }
   arr_2[0][0] = 1;
   for (int i=1; i<=size; i++){
      for (int j=0; j<=temp; j++){
         int temp_2 = arr_2[i−1][j ^ arr[i−1]];
         arr_2[i][j] = arr_2[i−1][j] + temp_2;
      }
   }
   return arr_2[size][match];
}
int main(){
   int arr[] = {4, 2, 8, 10, 3, 4, 4};
   int match = 2;
   int size = sizeof(arr)/sizeof(arr[0]);
   cout<<"Count of number of subsets having a particular XOR value are: "<<subset_XOR(arr, size, match);
   return 0;
}

출력

위의 코드를 실행하면 다음과 같은 출력이 생성됩니다 -

Count of number of subsets having a particular XOR value are − 8