C++でのサブ配列のビットごとのOR
非負の整数の配列Aがあるとします。 B =[A [i]、A [i + 1]、...、A [j]](i <=j)と言うすべての(連続する)サブ配列に対して、すべての要素のビットごとのORを実行します。 B、結果の取得A [i] | A [i + 1] | ... | A[j]。可能な結果の数を見つける必要があります。 (複数回発生した結果は、最終回答で1回だけカウントされます。)
したがって、入力が[1,1,2]の場合、サブ配列は[1]、[1]、[2]、[1,1]、[1,2]、[1]であるため、結果は3になります。 1,2]の場合、結果は1,1,2,1,3,3になり、3つの異なる結果が得られます。
これを解決するには、次の手順に従います-
-
retとcurr2の2つのセットを作成します
-
0から配列のサイズまでの範囲のiの場合
-
セットcurr1を作成し、それにA[i]を挿入します
-
curr2の各要素eについて-
-
curr1に(e OR A [i])を挿入します
-
-
各要素についてecurr1
-
retにeを挿入
-
-
curr2:=curr1
-
-
retの戻りサイズ
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; class Solution { public: int subarrayBitwiseORs(vector<int>& A) { unordered_set <int> ret; unordered_set <int> curr2; for(int i = 0; i < A.size(); i++){ unordered_set <int> curr1; curr1.insert(A[i]); unordered_set<int>::iterator it = curr2.begin(); while(it != curr2.end()){ curr1.insert(*it | A[i]); it++; } it = curr1.begin(); while(it != curr1.end()){ ret.insert(*it); it++; } curr2 = curr1; } return ret.size(); } }; main(){ vector<int> v = {1,1,2}; Solution ob; cout << (ob.subarrayBitwiseORs(v)); }
入力
[1,1,2]
出力
3
-
C ++のビットごとのORとは何ですか?
ビットごとのOR演算子(|)は、第1オペランドの各ビットを第2オペランドの対応するビットと比較します。いずれかのビットが1の場合、対応する結果ビットは1に設定されます。それ以外の場合、対応する結果ビットは0に設定されます。ビット単位の包括的OR演算子の両方のオペランドは、整数型である必要があります。たとえば、 例 #include <iostream> using namespace std; int main() { unsigned short a = 0x5555; /
-
C++のビット演算子
c++では3つのビット単位の演算子を使用できます。これらは、ビット単位のAND(&)、ビット単位のOR(|)、およびビット単位のXOR(^)です。 ビットごとのAND演算子(&)は、第1オペランドの各ビットを第2オペランドの対応するビットと比較します。両方のビットが1の場合、対応する結果ビットは1に設定されます。それ以外の場合、対応する結果ビットは0に設定されます。ビット単位の包括的AND演算子の両方のオペランドは、整数型である必要があります。たとえば、 例 #include <iostream> using namespace std; int mai