C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でのサブアレイのXOR


この問題では、配列内のLからRの範囲のarr[]といくつかのクエリが与えられます。私たちのタスクは、LからRまでのサブアレイのXORを出力することです。

問題を理解するために例を見てみましょう

入力 −配列={1、4、5、7、2、9} L =1、R =5

出力-

説明 − 4 ^ 5 ^ 7 ^ 2 ^ 9

  • この問題を解決するために、次の観察に基づいて配列を作成します。

  • 複数のビットをXORします。奇数の場合は、結果は1になり、そうでない場合は、結果は0になります。

次に、1のカウントを格納する2次元配列カウントを作成します。値count[i][j]は、位置i-jの1の数であり、ビットのi番目の位置にあるサブ配列arr[0..j]に存在する1の数です。サブ配列arr[L..R]のすべてのビットの1の数は、カウント配列を使用して検出されます。 arr [L ... R] =count [i] [R] --count[i][L-1]を見つける式。 1の数が奇数の場合、結果としてi番目のビットが設定されます。最終的な結果は、ビットが設定されている場合、i番目のビットに対応する2の累乗を合計することで得られます。

ソリューションの実装を示すプログラム

#include <bits/stdc++.h>
using namespace std;
void preProcessArray(int arr[], int n, vector<vector<int> >& cnt) {
   int i, j;
   for (i = 0; i < 32; i++) {
      cnt[i][0] = 0;
      for (j = 0; j < n; j++) {
         if (j > 0) {
            cnt[i][j] = cnt[i][j - 1];
         }
         if (arr[j] & (1 << i))
         cnt[i][j]++;
      }
   }
}
int findXORofSubArray(int L, int R, const vector<vector<int> > count) {
   int result = 0;
   int noOfOnes;
   int i, j;
   for (i = 0; i < 32; i++) {
      noOfOnes = count[i][R] - ((L > 0) ? count[i][L - 1] : 0);
      if (noOfOnes & 1) {
         result+=(1 << i);
      }
   }
   return result;
}
int main(){
   int arr[] = { 1, 4, 5, 7, 2, 9 };
   int n = sizeof(arr) / sizeof(arr[0]);
   vector<vector<int> > count(32, vector<int>(n));
   preProcessArray(arr, n, count);
   int L = 1;
   int R = 5;
   cout<<"The XOR of SubArray: "<<findXORofSubArray(L, R, count);
   return 0;
}

出力

The XOR of SubArray: 13

  1. C++での最小XOR値ペア

    問題の説明 整数の配列が与えられます。最小のXOR値を持つ配列でペアを見つけます 例 If arr[] = {10, 20, 30, 40} then minimum value pair will be 20 and 30 as (20 ^ 30) = 10. (10 ^ 20) = 30 (10 ^ 30) = 20 (10 ^ 40) = 34 (20 ^ 30) = 10 (20 ^ 40) = 60 (30 ^ 40) = 54 アルゴリズム 指定された配列のすべてのペアを生成し、それらの値のXORを計算します 最小XOR値を返します 例 #include <bits/s

  2. C++でのstatic_cast

    static_castは、通常/通常の型変換に使用されます。これは、暗黙的な型強制の原因となるキャストでもあり、明示的に呼び出すこともできます。 floatをintに、charをintに変換する場合などに使用する必要があります。これにより、関連する型クラスをキャストできます。 例 #include <iostream> using namespace std; int main() {    float x = 4.26;    int y = x; // C like cast    int z = static_cas