题解
首先我们发现位运算的时候 每一位运算都是独立的
所以可以把每一位都拆分 用个数组存下来
然后可以从m的2进制下最高位到0枚举每一位在运算后是否可以为1
若可以为1 则贪心取它 则一定最优
证明:2^k>2^0+2^1+2^2+2^3+....+2^k-1
#include<bits/stdc++.h>
#define T 111111
using namespace std;
int rev[T],a[T][33],ans=0,mx=0;
int n,m;
void cal(char s,int x)
{
if(s=='A') rev[x]=1;
if(s=='O') rev[x]=2;
if(s=='X') rev[x]=3;
}
void sl(int &x,int i,int p)
{
if(rev[i]==1) x&=a[i][p];
else if(rev[i]==2) x|=a[i][p];
else if(rev[i]==3) x^=a[i][p];
}
void slove(int p,int f)
{
int x=0;
for(int i=1; i<=n; i++) sl(x,i,p);
if(x) { ans+=1<<p; return; }
if(f)
{
x=1;
for(int i=1; i<=n; i++) sl(x,i,p);
if(x) ans+=1<<p,m-=1<<p;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
{
char s[10]; int x,p=0;
scanf("%s%d",s,&x);
cal(s[0],i);
while(x) a[i][p++]=x&1,x>>=1;
mx=max(mx,p-1);
}
int mu; for(mu=0; (1<<mu)<=m; mu++);
mx=max(mu,mx);
for(int i=mx; i>=0; i--)
if((1<<i)<=m) slove(i,1);
else slove(i,0);
cout << ans;
return 0;
}