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に挿入します
- 回答を返す
理解を深めるために、次の実装を見てみましょう-
#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]
-
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
-
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