Solution
考虑位运算的特点:不进位。
于是可以将答案的每一位分开考虑。从高位到低位枚举每一位所选的 情况。若当前位第
位经过一系列运算后结果可以为
,那就将答案加上
。由于枚举时由高到低,贪心地使高位为
即可(第
位贡献的答案比第
位到第
位贡献的和还要多)。注意累加值不超过
。
Code
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1e5+10;
struct node{
string op;
int t;
}a[maxn];
int n,m,sum,ans;
int fr(){
char ch=getchar();
while(ch>'9'||ch<'0')
ch=getchar();
int sum=ch-'0';
while((ch=getchar())>='0'&&ch<='9')
sum=(sum<<3)+(sum<<1)+ch-'0';
return sum;
}
int check(int x,int y){
int z;
for(int i=1;i<=n;i++){
z=a[i].t>>y&1;
if(a[i].op=="AND")
x&=z;
else if(a[i].op=="OR")
x|=z;
else
x^=z;
}
return x;
}
int main(){
n=fr(); m=fr();
for(int i=1;i<=n;i++){
cin>>a[i].op;
a[i].t=fr();
}
int x,y;
for(int i=29;i>=0;i--){
x=check(1,i);
y=check(0,i);
if(x>y&&sum+(1<<i)<=m){
sum+=(1<<i);
ans+=(x<<i);
}
else
ans+=(y<<i);
}
printf("%d",ans);
return 0;
} 
京公网安备 11010502036488号