传送门:bzoj3668
题解
从大到小按位贪心即可
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,m,ans,pre,nw;
char cp,SS[15];
inline void rd(int &x)
{
cp=getchar();x=0;
for(;!isdigit(cp);cp=getchar());
for(;isdigit(cp);cp=getchar()) x=(x<<3)+(x<<1)+(cp^48);
}
struct P{
int op,t;
inline void inn(){
scanf("%s",SS);rd(t);
if(SS[0]=='O') op=1;
else if(SS[0]=='X') op=2;
}
}a[N];
inline int cal(int x)
{
for(int i=1;i<=n;++i){
if(!a[i].op) x&=a[i].t;
else if(a[i].op==1) x|=a[i].t;
else x^=a[i].t;
}
return x;
}
int main(){
int i,j;
rd(n);rd(m);
for(i=1;i<=n;++i) a[i].inn();
pre=cal(ans);
for(i=29;~i;--i){
j=1<<i;
if(ans+j>m) continue;
nw=cal(ans+j);
if(pre<nw) {pre=nw;ans+=j;}
}
printf("%d",pre);
return 0;
}