额
我觉得实际上这是真的水
很容易想到二进制拆分
所以
从高位到底按位贪心
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
inline void read(int &x){
x=0;
char ch=getchar();
int f=1;
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
x*=f;
}
const int N=1e5+1000;
int ans=0;
struct Door{
char opt[3];
int t;
}A[N];
int n,m;
int check(int sum){
for(int i=1;i<=n;i++){
if(A[i].opt[0]=='A'){
sum =sum & A[i].t;
}
if(A[i].opt[0]=='O'){
sum =sum | A[i].t;
}
if(A[i].opt[0]=='X'){
sum =sum ^ A[i].t;
}
}
return sum;
}
int main(){
// freopen("P2114.in","r",stdin);
read(n);
read(m);
for(int i=1;i<=n;i++){
scanf("%s",A[i].opt);
read(A[i].t);
}
for(int i=30;i>=0;i--){
if(ans+(1<<i)>m)continue;
int x=check(ans)&(1<<i);
int y=check(ans+(1<<i))&(1<<i);
if(x<y)ans+=(1<<i);
}
cout<<check(ans);
}