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

C++でのサブアレイのXORクエリ


正の整数の配列arrと、querys [i] =[Li、Ri]の配列クエリがあるとします。各クエリについて、iはLiからRiまでの要素のXORを計算します。 (つまり、arr [Li] XOR arr [Li + 1] xor ... xor arr [Ri])。指定されたクエリの結果を含む配列を見つける必要があります。したがって、入力が− [1,3,4,8]のようであり、クエリが[[0,1]、[1,2]、[0,3]、[3,3]]のようである場合、結果は[2,7,14,8]になります。これは、配列内の要素のバイナリ表現が-1 =0001、3 =0011、4 =0100、および8 =1000であるためです。この場合、クエリのXOR値は-[0,1] =1 xor 3 =2です。 [1,2] =3 xor 4 =7、[0,3] =1 xor 3 xor 4 xor 8=14および[3,3]=8

これを解決するには、次の手順に従います-

  • n:=arrのサイズ
  • サイズn+1のpreという配列を定義してから、pre [i]:=pre [i – 1] XOR arr [i – 1]
  • となるようにpreを入力します。
  • 別の配列を定義します
  • 0からクエリ数の範囲のiの場合– 1
    • l:=クエリ[i、0]、r:=クエリ[i、1]
    • lとrを1増やします
    • pre [r] XORpre[l-1]をansに挿入します
  • 回答を返す
例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& queries) {
      int n = arr.size();
      vector <int> pre(n + 1);
      for(int i = 1; i <=n; i++){
         pre[i] = pre[i - 1] ^ arr[i - 1];
      }
      vector <int> ans;
      for(int i = 0; i < queries.size(); i++){
         int l = queries[i][0];
         int r = queries[i][1];
         l++;
         r++;
         ans.push_back(pre[r] ^ pre[l - 1]);
      }
      return ans;
   }
};
main(){
   vector<int> v = {1,3,4,8};
   vector<vector<int>> v1 = {{0,1},{1,2},{0,3},{3,3}};
   Solution ob;
   print_vector(ob.xorQueries(v, v1));
}

入力

[1,3,4,8]
[[0,1],[1,2],[0,3],[3,3]]

出力

[2,7,14,8]

  1. C ++でサブ配列を反転して、0の数を最大化します

    問題の説明 バイナリ配列が与えられた場合、サブ配列の1回の反転が許可されている配列内のゼロの最大数を見つけます。フリップ操作は、すべての0を1に、1を0に切り替えます arr1 ={1、1、0、0、0、0、0}の場合 最初の21を0に反転すると、次のようにサイズ7のサブ配列を取得できます- {0, 0, 0, 0, 0, 0, 0} アルゴリズム 1. Consider all subarrays and find a subarray with maximum value of (count of 1s) – (count of 0s) 2. Considers this

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