通过一个全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; }