直接枚举每一位是0还是1,从高到底枚举哟。途中判断示范超范围。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<string>
#define eps 1e-12
#define INF 0x7fffffff
#define maxn 5222
using namespace std;
int n,m;
char s[100005][5];
int st[100005];
int x[100005];
int main()
{
freopen("sleep.in","r",stdin);
freopen("sleep.out","w",stdout);
scanf("%d%d",&n,&m);
{
int tm=m;
for(int i=1;i<=n;i++)
{
scanf("%s%d",s[i],&x[i]);
}
int v[40]={0};
int ans[2][40]={0};
int k=0;
while(m)
{
if(m&1) v[k]=1;
m>>=1;
k++;
}
int tmp;
for(int i=0;i<k;i++)
{
tmp=(1<<i);
for(int r=1;r<=n;r++)
{
if(s[r][0]=='A') tmp&=x[r];
else if(s[r][0]=='O') tmp|=x[r];
else if(s[r][0]=='X') tmp^=x[r];
}
if(((1<<i)&tmp)) ans[1][i]=1;
else ans[1][i]=0;
}
tmp=0;
for(int r=1;r<=n;r++)
{
if(s[r][0]=='A') tmp&=x[r];
else if(s[r][0]=='O') tmp|=x[r];
else if(s[r][0]=='X') tmp^=x[r];
}
for(int r=0;r<31;r++)
{
if(((1<<r)&tmp)) ans[0][r]=1;
else ans[0][r]=0;
}
long long ANS=0;
long long all=0;
for(int r=31;r>=0;r--)
{
if(ans[0][r]==1)
{
ANS+=(1<<r);
}
else if(ans[1][r]==1&&(all+(1<<r))<=tm)
{
all+=(1<<r);
ANS+=(1<<r);
}
}
cout<<ANS<<endl;
}
return 0;
}