noi2014——起床困难综合症

号称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();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值