Problem
Mean
在0到m间选取一个数,使其经过若干次关于某个值的OR, XOR或AND运算后所得结果最大。
Analysis
二进制下从高位到低位贪心即可。
运算结果相同的情况下当前位取0优于取1。
Code
#include<cstdio>
const int N=100005;
int n,m,s;
struct Door{
char op[5];
int t;
}d[N];
void dfs(int x){
if(m>>x) dfs(x+1);
for(int j=0;j<2 && s+(j<<x-1)<=m;j++){
int t=j<<x-1;
for(int i=0;i<n;i++){
if(d[i].op[0]=='O') t|=d[i].t;
else if(d[i].op[0]=='X') t^=d[i].t;
else t&=d[i].t;
}
if(t>>x-1&1){s+=j<<x-1;break;}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%s%d",d[i].op,&d[i].t);
dfs(1);
for(int i=0;i<n;i++){
if(d[i].op[0]=='O') s|=d[i].t;
else if(d[i].op[0]=='X') s^=d[i].t;
else s&=d[i].t;
}
printf("%d",s);
return 0;
}