Computer >> Máy Tính >  >> Lập trình >> C ++

Đếm số tập con có giá trị XOR cụ thể trong C ++

Cho một mảng arr [] chứa các số nguyên dương và một giá trị khớp. Mục đích là tìm các tập con của arr [] có chứa các phần tử có XOR =match.

Ví dụ

Đầu vào

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

Đầu ra

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

Giải thích

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

Đầu vào

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

Đầu ra

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

Giải thích

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

Phương pháp tiếp cận được sử dụng trong chương trình dưới đây như sau -

Trong cách tiếp cận này, chúng tôi sẽ sử dụng một giải pháp lập trình động. Mảng arr_2 [] [] sẽ giữ các giá trị tại chỉ mục i, j sao cho arr_2 [i] [j] có giá trị XOR của các phần tử từ các tập con của arr [0 đến i-1]. Lấy giá trị ban đầu arr_2 [0] [0] là 1, đối với tập rỗng XOR là 1. Đặt arr_2 [i] [j] =arr_2 [i-1] [j] + arr_2 [i-1] [j ^ arr [i − 1]], Nếu tập con arr [0 đến i − 2] có XOR là j thì tập con arr [0 đến i − 1] cũng có XOR j. Ngoài ra nếu tập con arr [0 đến i − 2] có XOR là j ^ arr [i] thì tập con arr [0 đến i − 1] cũng có XOR j là j ^ arr [i − 1] ^ arr [i − 1] . Kết quả sẽ được tìm thấy trong arr_2 [size] [match].

  • Lấy một mảng số nguyên arr [].

  • Lấy đối sánh biến dưới dạng số nguyên.

  • Hàm subset_XOR (int arr [], int size, int match) nhận một mảng đầu vào và độ dài của nó và trả về số lượng các tập hợp con có giá trị XOR cụ thể.

  • Ban đầu lấy cao nhất =arr [0]. Bây giờ, xem qua toàn bộ arr [] bằng vòng lặp for và tìm giá trị lớn nhất là cao nhất.

  • Tính temp =(1 <<(int) (log2 (cao nhất) + 1)) - 1 là giá trị XOR lớn nhất có thể.

  • Lấy mảng arr_2 [size + 1] [temp + 1] để lưu trữ XOR.

  • Khởi tạo toàn bộ arr_2 với các số 0 bằng vòng lặp for.

  • Đặt arr_2 [0] [0] =1.

  • Sử dụng vòng lặp for từ i =0 đến i <=size và j =0 đến j <=size, đặt temp_2 =arr_2 [i − 1] [j ^ arr [i − 1]] và đặt arr_2 [i] [j ] =arr_2 [i − 1] [j] + temp_2.

  • Ở cuối cả hai vòng lặp for, chúng ta sẽ có arr_2 [size] [match] là số lượng tập hợp con có giá trị XOR cụ thể.

  • Kết quả là trả về arr_2 [size] [match].

Ví dụ

#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;
}

Đầu ra

Nếu chúng ta chạy đoạn mã trên, nó sẽ tạo ra kết quả sau -

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