我从m的最大位开始枚举,但要错好几个点
#include<bits/stdc++.h>
using namespace std;
int n,m,x,ans,v,a[100005];
string s[100005];
inline int read(){
int ret=0;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) ret=ret*10+ch-'0',ch=getchar();
return ret;
}
int check(int b,int l){
for(int i=1;i<=n;i++){
int k=(a[i]>>l)&1;
if(s[i]=="AND") b&=k;
else if(s[i]=="OR") b|=k;
else b^=k;
}
return b;
}
int main(){
// freopen("x.in","r",stdin);
// freopen("x.out","w",stdout);
n=read(),m=read();
for(int i=1;i<=n;i++){
char c[5];
scanf("%s",c);
s[i]=c;a[i]=read();
}
while(m>=(1<<x)) x++;
for(int i=x;i>=0;i--){
int res0=check(0,i);
int res1=check(1,i);
if(v+(1<<i)<=m&&res1>res0) v+=(1<<i),ans+=res1<<i;
else ans+=res0<<i;
}
printf("%d\n",ans);
return 0;
}