通过一个全0 和 全1的二进制int数进行一系列操作可以得到每一位上如果填0或1的时候是什么样的情况。然后从前向后遍历二进制位,如果当前位可以由0变化成1那么可以直接将结果伤害的这一位填上1,如果只能由1变成1那么就需要判断当前的位上的原始伤害会不会超过范围,如果超过了就意味着无法填1。
#include <bits/stdc++.h>
using namespace std;
inline int read() {
int x=0, y=1;
char c = getchar();
while (c=='-') {
y = -y;
c = getchar();
}
while (c>='0'&&c<='9') {
x = x*10+(c-'0');
c = getchar();
}
return x;
}
int main() {
int n = read(), m = read();
int all0=0, all1=-1;
while (n--) {
string op;
cin>>op;
getchar();
int t = read();
if (op[0]=='A') {
all0 &= t; all1 &= t;
} else if (op[0]=='O') {
all0 |= t; all1 |= t;
} else {
all0 ^= t; all1 ^= t;
}
}
int i = 0, ans=0;
for (i = (1<<30);i;i>>=1) {
if (all0&i) ans|=i;
else if (all1&i&&i<=m) {
m ^= i;
ans |= i;
}
}
cout<<ans;
return 0;
}

京公网安备 11010502036488号