题目大意:给定n次操作(与,或,异或),在0~m中选择一个数,使这个数经过n次操作后得到的值最大
题解:考虑直接枚举选择的数会T,二进制枚举选择数的每一位,由于二进制位分别独立,且二进制高位优于低位,可以贪心
对于每一位当前的决策
若选1不超过m且选1较优,则选1
否则选0,因为选0对后面的决策更优
我的收获:二进制位独立
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define M 100100
int n,m,t,ans;
char s[100];
struct abcd{
int p,x;
int cross(int y){
if(p==0) return x&y;
if(p==1) return x|y;
return x^y;
}
}a[M];
int cross(int x)
{
for(int i=1;i<=n;i++) x=a[i].cross(x);
return x;
}
void work()
{
for(t=1;t<=m;t<<=1);
for(t>>=1;t;t>>=1)
{
int x=cross(0)&t,y=cross(t)&t;
if(ans+t<=m&&x<y) ans+=t;
}
printf("%d\n",cross(ans));
}
void init()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%s",s);
if(s[0]=='A') a[i].p=0;
if(s[0]=='O') a[i].p=1;
if(s[0]=='X') a[i].p=2;
scanf("%d",&a[i].x);
}
}
int main()
{
init();
work();
return 0;
}