题意:给 n n n个位运算 ( A N D , O R , X O R ) (AND,OR,XOR) (AND,OR,XOR)和m,要求从 0 − m 0-m 0−m中取一个数依次进行这n个操作,求操作后的最大值。
#include<bits/stdc++.h>
using namespace std;
int maxn=(1<<30)-1;
bitset<30>a,b(maxn),ans;//a为0,b全为1
int n,m,t;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
char s[1001];
cin>>s>>t;
if(s[0]=='A')a&=t,b&=t;
if(s[0]=='O')a|=t,b|=t;
if(s[0]=='X')a^=t,b^=t;
}
for(int i=30;i>=0;i--)//因为要求取从0-m取值,所以求最大值应该从高位开始
{
if(a[i])ans[i]=1;//0操作后结果为1可以直接取因为当前为是0,不会导致取值后超过m
else if(b[i]&&(1<<i)<=m)//1作后结果为1,如果当前取值不超过m,则取值
{
ans[i]=1;
m-=(1<<i);
}
}
cout<<ans.to_ulong()<<endl;//将二进制转化为十进制
return 0;
}