题意:有一些位运算操作,找出一个小于m的整数使其经过这些操作后得到的数最大.

对于这个整数的每一位之间运算互不影响,所以我们从高位到地位贪心填二进制数,使其这一位能得到1

#include<cstdio>
using namespace std;
const int N=1e5+5;
int n,m;
int op[N],w[N];
char s[233];
int calc(int x)
{
  for(int i=1;i<=n;i++)
    {
      if(op[i]==1) x&=w[i];
      if(op[i]==2) x|=w[i];
      if(op[i]==3) x^=w[i];
    }
  return x;
}
int main()
{
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++)
    {
      scanf("%s",s);
      if(s[0]=='A') op[i]=1;
      else if(s[0]=='O') op[i]=2;
      else op[i]=3;
      scanf("%d",&w[i]);
    }
  int u=1,qaq=calc(0);
  for(;u<=m;u<<=1);
  u>>=1;
  int ans=0;
  for(;u;u>>=1)
    {
      if(qaq&u) continue;
      if(ans+u>m) continue;
      if(u&calc(u))ans+=u;
    }
  printf("%d\n",calc(ans));
  return 0;
}