分析

由于每一位之间的计算是独立的
并且最后选择每个位上的数时
一定是贪心取0而后取1
所以我们可以对于每一位取1或0进行操作
但这样的话复杂度比较高
我们直接考虑用一个全1的二进制数(-1)和全0的二进制数(0)进行所有操作
最后贪心取0或1即可
时间复杂度:
期望得分:100分
温馨提示:注意细节,需要判到32位,不然只有90。。。

代码

//P2114
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>

#define LL long long
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(LL i=A;i<=B;i++)
#define BOR(i,A,B) for(LL i=A;i>=B;i--)
#define De(X) cerr<<#X<<" = "<<X<<endl
#define Lowbit(X) (X & (-X))
#define Skip cout<<endl;
#define INF 0x3f3f3f3f3f3f3f3f
#define Mod 998244353
#define Rson (X<<1|1)
#define Lson (X<<1)
using namespace std;

LL Limit,Total;
LL A=-1,B=0,Val;
char Opt[5];

inline void File() {
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
}

signed main() {
    // File();
    // ios::sync_with_stdio(false);
    scanf("%lld %lld",&Total,&Limit);
    FOR(i,1,Total) {
        scanf("%s",Opt+1);
        scanf("%lld",&Val);
        if(Opt[1]=='A') { A &= Val; B &= Val; }
        else if(Opt[1]=='O') { A |= Val; B |= Val; }
        else { A ^= Val; B ^= Val; }
    }
    LL Temp=0,Ans=0;
    BOR(i,32,0) {
        if((B>>i) & 1ll) { Ans+=(1ll<<i); }
        else if((A>>i) & 1ll) { if(Temp+(1ll<<i)<=Limit) { Ans+=(1ll<<i); Temp+=(1ll<<i); } }
    }
    printf("%lld\n",Ans);
    // fclose(stdin);
    // fclose(stdout);
    system("pause");
    return 0;
}