贪心 位运算乱搞
这道题是关于位运算的一些神奇的东西。
因为每一位之间互不影响,因此我们可以一位一位地放进传送门里,这样就只有0/1这两种情况。
然后就变成简单的贪心了(优先取高位的)。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100005
using namespace std;
int n,m,nd,ans,op[N];
char s[4];
int main(){
scanf("%d%d",&n,&m);
int x=0x7fffffff,y=0;//x全是1,y全是0
for (int i=1;i<=n;i++){
scanf("%s%d",s,&op[i]);
if (s[0]=='A') x&=op[i],y&=op[i];
if (s[0]=='O') x|=op[i],y|=op[i];
if (s[0]=='X') x^=op[i],y^=op[i];
}
int state=0;
for (int i=31;i>=1;i--)
if (y&(1<<i-1)) ans+=1<<i-1;//如果0放进去是1那么优先取0
else if ((x&(1<<i-1))&&state+(1<<i-1)<=m)
state+=1<<i-1,ans+=1<<i-1;
//保证当前取的状态加上现在取1的状态不超过m
printf("%d\n",ans);
return 0;
}