每一位二进制互相不影响
所以预处理第位为
或者
的最后值
这样就是一个简单的数位了
非常简单啊....
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+10;
int n,m;
int a[maxn][4],dp[maxn][3];
//dp[i][j]表示在第i位二进制初始是j的情况下现在是多少
signed main()
{
cin >> n >> m;
for(int j=0;j<=30;j++) dp[j][1]=1;
for(int i=1;i<=n;i++)
{
string s; int w;
cin >> s >> w;
for(int j=0;j<=30;j++)
{
int v = bool((1<<j)&w);
if( s=="AND" )
dp[j][0]&=v,dp[j][1]&=v;
else if( s=="OR" )
dp[j][0]|=v,dp[j][1]|=v;
else
dp[j][0]^=v,dp[j][1]^=v;
}
}
int ans=0,limits=1;
for(int i=30;i>=0;i--)//大到小贪心
{
if( !limits ) ans+=max( dp[i][0]<<i,dp[i][1]<<i );
else
{
int v = bool((1<<i)&m),temp=0;
if( v==0 )
ans += ( dp[i][v]<<i );
else
{
ans += max(dp[i][0]<<i,dp[i][1]<<i );
if( dp[i][1]<=dp[i][0] ) limits=0;
}
}
}
cout << ans;
}
京公网安备 11010502036488号