传送门:起床困难综合症
思路:要知道位运算永远只会改变本位,与其它位泾渭分明。据此,我们不难看出,每个位仅有1、0两种状态,在全部运算后,寻找两种状态的最大结果即可。
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int f=(1<<31)-1,t,ans=0;
int main()
{
int n,k,x;
string op;
cin>>n>>k;
int Max=k;
for(int i=0;i<n;i++)
{
cin>>op>>x;
Max=max(Max,x);
if(op=="XOR")
{
t^=x;
f^=x;
}
else if(op=="OR")
{
t|=x;
f|=x;
}
else
{
t&=x;
f&=x;
}
}
for(int i=0;i<31;i++)
{
if((t>>i)&1) ans+=(1<<i);
else if( ((f>>i)&1) && (k>=(1<<i)) ) ans+=(1<<i);
}
cout<<ans<<endl;
return 0;
}