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
-
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
-
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