网易笔试-按位或运算
小易有一个初始为空的数字集合,支持两种操作:
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; }
等风起的那一天,我已准备好一切