ll ans=0,temp=m;
for(int i=31;i>=0;i--)
{
if( zero[i] ) ans+=bit[i];//第i位初始只要是0就好了,何乐而不为呢
else if( one[i]&&temp>=bit[i] )//第i位初始是1才行,那么当前还选的数不大于m就拿!!
//为什么能到就拿?因为如果不拿,就算拿了前面的所有1,也不会比(1<<i)的贡献多
{
temp-=bit[i];
ans+=bit[i];
}
}
当然如果没想到高位往低位贪心,可以用用搜索来解决
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
ll a[maxn],one[maxn],zero[maxn],n,m,s,bit[maxn];
string w;
int main()
{
cin >> n >> m;
bit[0]=one[0]=1;
for(int i=1;i<=31;i++)
bit[i]=bit[i-1]*(ll)2,one[i]=1;
for(int i=1;i<=n;i++)
{
cin >> w >> s;
for(int j=0;j<=31;j++)//拿s的第j位去和
{
int ok=0;
if( s&bit[j] ) ok=1;
if( w[0]=='A' ) one[j]&=ok,zero[j]&=ok;
else if( w[0]=='O' ) one[j]|=ok,zero[j]|=ok;
else one[j]^=ok,zero[j]^=ok;
}
}
ll ans=0,temp=m;
for(int i=31;i>=0;i--)
{
if( zero[i] ) ans+=bit[i];//初始只要是0就好了,何乐而不为呢
else if( one[i]&&temp>=bit[i] )
{
temp-=bit[i];
ans+=bit[i];
}
}
cout<<ans;
}