음이 아닌 정수의 배열 A가 있다고 가정합니다. 모든 (인접한) 하위 배열에 대해 B =[A[i], A[i+1], ..., A[j]] (i <=j 사용)에 대해 모든 요소의 비트 OR을 수행합니다. B, 결과 얻기 A[i] | A[i+1] | ... | 에이[제]. 가능한 결과의 수를 찾아야 합니다. (두 번 이상 발생한 결과는 최종 답변에서 한 번만 계산됩니다.)
따라서 입력이 [1,1,2]와 같으면 하위 배열이 [1], [1], [2], [1,1], [1,2], [1, 1,2], 결과는 1,1,2,1,3,3이 되고 세 가지 다른 결과가 나타납니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
두 세트 ret 및 curr2 생성
-
범위 0에서 배열 크기까지의 i에 대해
-
세트 curr1을 만들고 A[i]를 삽입하십시오.
-
curr2의 각 요소 e에 대해 -
-
curr1에 (e OR A[i]) 삽입
-
-
각 요소 e curr1
-
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