网易笔试-按位或运算

小易有一个初始为空的数字集合,支持两种操作:
1、加入数字x到集合中。

2、询问集合中是否存在一个子集,满足子集中所有数字的Or值恰好为k。

Or为二进制按位或操作,C++中表示为"|"。
小易希望你能解决这个问题。

思路:或运算的规则是有1 就为1  

判断子集的所有或运算值是否和k相等,只要把符合条件   vec[i] | k==k  的所有vec[i]值存起来

int ans=0;

ans=ans | vec[i];

最后的ans==k相等,就输出YES

#include <iostream>
#include <vector>
#include <algorithm>
#include<stack>
#include<math.h>
using namespace std;
int main() {
    vector<int> vec;
    int n, q;
    cin >> q;
    int x, y;
    for (int i = 0; i < q; ++i) {
        cin >> x >> y;
        if (x == 1)
        {
            vec.push_back(y);
            continue;
        }
        int ans = 0;
        for (int i = 0; i < vec.size(); i++) {
            
            if ((vec[i] | y)==y)
            {
                ans = ans | vec[i];
            }
        }
        if(ans==y)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/-citywall123/p/13410922.html