每一位二进制互相不影响
所以预处理第位为或者的最后值
这样就是一个简单的数位了
非常简单啊....
#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; }