每一位二进制互相不影响

所以预处理第位为或者的最后值

这样就是一个简单的数位

非常简单啊....

#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;
}