Computer >> Máy Tính >  >> Lập trình >> C ++

Bộ ba với Bitwise VÀ Bằng 0 trong C ++

Giả sử chúng ta có một mảng các số nguyên A. Chúng ta phải tìm số bộ ba chỉ số (i, j, k) sao cho -

  • 0 <=i

  • 0 <=j

  • 0 <=k

A [i] AND A [j] AND A [k] là 0, trong đó AND đại diện cho toán tử AND bit.

Vì vậy, nếu đầu vào là [3,1,2], thì đầu ra sẽ là 12

  • Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định một bản đồ m

  • ret:=0

  • n:=kích thước của A

  • để khởi tạo i:=0, khi i

    • để khởi tạo j:=0, khi j

      • để khởi tạo j:=0, khi j

  • để khởi tạo i:=0, khi i

    • x:=A [i]

    • cho tất cả các cặp khóa-giá trị a trong m

      • nếu (a.key AND x) giống 0, thì -

        • ret:=ret + a.value

  • trả lại ret

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

Ví dụ

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int countTriplets(vector<int>& A){
      unordered_map<int, int> m;
      int ret = 0;
      int n = A.size();
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < n; j++) {
            m[A[i] & A[j]]++;
         }
      }
      for (int i = 0; i < n; i++) {
         int x = A[i];
         for (auto& a : m) {
            if ((a.first & x) == 0) {
               ret += a.second;
            }
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {3,1,2};
   cout << (ob.countTriplets(v));
}

Đầu vào

{3,1,2}

Đầu ra

12