难度:4
第一道位运算的题,还不是很熟悉,位运算主要有四种外加左移右移,然后一个特点是不进位,当前点的计算结果就改变当前位,不会影响其它的位,所以可以按照位依次来找,然后就是判断什么情况下,当前点可以选1,这个值这道题的难点,
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
const int N = 1e5 + 5;
int n, m;
pair<string, int> p[N];
int calc(int bit, int x) {
for (int i = 0; i < n; i++) {
int t = (p[i].se >> bit) & 1;
if (p[i].fi == "AND") x &= t;
else if (p[i].fi == "OR") x |= t;
else x ^= t;
}
return x;
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
string s;
int x;
cin >> s >> x;
p[i] = make_pair(s, x);
}
int val = 0, ans = 0;
for (int i = 29; i >= 0; i--) {
int x0 = calc(i, 0);
int x1 = calc(i, 1);
if (val + (1 << i) <= m && x0 < x1) {
val += (1 << i);
ans += (1 << i);
} else {
ans += (x0 << i);
}
}
cout << ans;
return 0;
}