LeetCode 982. Triples with Bitwise AND Equal To Zero

题目链接:https://leetcode.com/problems/triples-with-bitwise-and-equal-to-zero/

题意,已知数组A,长度不超过1000,最大的数不超过$2^{16}$,问存在多少对i,j,k,使得A[i]^A[j]^a[k]=0,i,j,k可以相等。

若直接暴力复杂度为$O(n^3)$,观察到数组不超过$2^{16}$,因此可以先枚举i和j,将结果存储,则结果不超过$2^{17}$,再查找符合的k,复杂度$O(n^2+n*2^{17})$。

class Solution {
public:
    int countTriplets(vector<int>& A) {
        int ans=0;
        vector<int> mp(1<<16,0);  //存储A[i]*A[j]的个数
        for(int i=0;i<A.size();i++) //枚举i和j
            for(int j=0;j<A.size();j++)
                mp[A[i]&A[j]]++; 
        for(int i=0;i<A.size();i++)  //枚举k
            for(auto j = 0 ;j<(1<<16); j++){
                if((A[i]&j)==0)
                    ans+=mp[j];
                else j=j+(A[i]&j)-1;
            }
        return ans;
    }
};

  

 

posted @ 2020-09-23 22:09  dlutjwh  阅读(220)  评论(0编辑  收藏  举报