号称noi有史以来第一水题 果然名不虚传 orzorz
这道题 看见or xor and 果断二进制 位运算大法好
本来想写数位dp
但是考虑到 一个2^n取1 或者0 要么得到 2^n 要么得到0
所以不用dp了
从大到小贪心就是了
哎 希望明年的7月 我能有幸noi
//and 1 or 2 xor 3
#include<cstdio>
#define MAXN (100000+10)
#define max(a,b) a>b?a:b
#define loop(i,j,k,l) for(int i=j;l>0?i<=k:i>=k;i+=l)
int n,m;
int a[MAXN];
int cal[MAXN];
char s[5];
int getone[50];
int getzero[50];
int one,zero;
int maxn,point;
void readdata(){
scanf("%d%d",&n,&m);
loop(i,1,n,1){
scanf("%s %d",s,&a[i]);
maxn=max(a[i],maxn);
if(s[0]=='X'){
cal[i]==3;
}
else{
if(s[0]=='A'){
cal[i]=1;
}
else cal[i]=2;
}
}
}
void ready() {
int temp;
for(int j=0;(1<<j)<=maxn;j++) {
point=j;
one=1;
zero=0;
loop(i,1,n,1){
if(cal[i]==1){
temp=a[i]-(a[i]>>1<<1);
one&=temp;
zero&=temp;
a[i]>>=1;
}
else{
if(cal[i]==2){
temp=a[i]-(a[i]>>1<<1);
one|=temp;
zero|=temp;
a[i]>>=1;
}
else{
temp=a[i]-(a[i]>>1<<1);
one^=temp;
zero^=temp;
a[i]>>=1;
}
}
}
getone[j]=one<<j;
getzero[j]=zero<<j;
}
}
void solve(){
int now=0;
int ans=0;
for(int i=point;i>=0;i--) {
ans+=getzero[i];
}
for(int i=point;i>=0;i--) {
if(getone[i]>getzero[i]){
if(now+(1<<i)>m)
continue;
ans+=getone[i];
now+=(1<<i);
}
}
printf("%d\n",ans);
}
int main(){
readdata();
if(m==0){
zero=0;
loop(i,1,n,1){
if(cal[i]==1){
zero&=a[i];
}
else{
if(cal[i]==2){
zero|=a[i];
}
else{
zero^=a[i];
}
}
}
printf("%d\n",zero) ;
return 0;
}
ready();
solve();
}