题面:Luogu2114 BZOJ3668
既然都是一堆位运算了,我们按位来搞好了
一个很显然的贪心策略,高位选0对接下来选择更有利
所以我们直接按位从高到低贪心,计算这一位是0或1对答案的贡献,如果选1贡献大于0,选1,否则选0
大于m了选0
然后就好了。。。
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <ctime>
#include <map>
#include <queue>
#include <cstdlib>
#include <string>
#include <climits>
#include <set>
#include <vector>
using namespace std;
int n,m,ans=0;
char c[100001][5];
int q[100001];
inline int check(int x){
for(int i=1;i<=n;i++){
if(c[i][1]=='A')x&=q[i];
if(c[i][1]=='O')x|=q[i];
if(c[i][1]=='X')x^=q[i];
}
return x;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%s%d",c[i]+1,&q[i]);
for(int i=31;i>=0;i--){
if(ans+(1<<i)>m)continue;
int x=check(ans+(1<<i)),y=check(ans);
if(x>y)ans+=1<<i;
}
printf("%d",check(ans));
return 0;
}