简单题吧
二进制各个位置是独立的
所以可以一位一位贪心来做
爆枚每一位是0还是1,然后
O(n)
验证
时间代价
O(Nlog2M)
#include <bits/stdc++.h>
#define N 200050
using namespace std;
inline int rd() {
int x=0,f=1;char ch=getchar();
while (ch>'9'||ch<'0') {if(ch=='-')f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
struct Dat{int _,t;}Q[N];
int n,m,t;
char s[10];
int check(int x) {
for (int i=1;i<=n;i++) {
Q[i]._==1? x&=Q[i].t :0;
Q[i]._==2? x|=Q[i].t :0;
Q[i]._==3? x^=Q[i].t :0;
}
return x;
}
int main() {
n = rd(), m = rd();
for (int i=1;i<=n;i++) {
scanf("%s%d",s+1,&t);
if (s[1] == 'A') Q[i] = (Dat){1,t};
if (s[1] == 'O') Q[i] = (Dat){2,t};
if (s[1] == 'X') Q[i] = (Dat){3,t};
}
int ans = 0;
for (int i=30;i>=0;i--) {
int na = ans + (1<<i);
if (na > m) continue;
if (check(na) > check(ans)) ans = na;
}
cout << check(ans) << endl;
return 0;
}