用 C++ 統計具有特定 XOR 值的子集個數


給定一個包含正整數的陣列 arr[] 和一個值 match。目標是找到 arr[] 的子集,這些子集的元素 XOR 值等於 match。

例如

輸入

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[][] 將在索引 i,j 處包含值,使得 arr_2[ i ][ j ] 的值為 arr[ 0 到 i−1 ] 的子集的元素的 XOR。將初始值 arr_2[0][0] 設定為 1,因為空集的 XOR 為 1。設定 arr_2[i][j] = arr_2[i−1][j] + arr_2[i−1][j ^ arr[i−1]],如果子集 arr[0 到 i−2] 的 XOR 為 j,則子集 arr[0 到 i−1] 的 XOR 也為 j。同樣,如果子集 arr[0 到 i−2] 的 XOR 為 j^arr[i],則子集 arr[0 到 i−1] 的 XOR 也為 j,因為 j ^ arr[i−1] ^ arr[i−1]。結果將在 arr_2[ size ][ match ] 中找到。

  • 取一個整數陣列 arr[]。

  • 取變數 match 為整數。

  • 函式 subset_XOR(int arr[], int size, int match) 接收一個輸入陣列及其長度,並返回具有特定 XOR 值的子集個數。

  • 最初取 highest = arr[0]。現在使用 for 迴圈遍歷整個 arr[] 並找到最大值 highest。

  • 計算 temp = (1 << (int)(log2(highest) + 1) ) − 1 作為最大可能的 XOR 值。

  • 取陣列 arr_2[size+1][temp+1] 來儲存 XOR 值。

  • 使用 for 迴圈用 0 初始化整個 arr_2。

  • 設定 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 迴圈結束時,我們將有 arr_2[size][match] 作為具有特定 XOR 值的子集個數。

  • 返回 arr_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

更新於:2021年1月5日

334 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告