记录编号 438393 评测结果 AAAAAAAAAA
题目名称 [NOI 2014]起床困难综合症 最终得分 100
用户昵称 GravatarCSU_Turkey 是否通过 通过
代码语言 C++ 运行时间 0.808 s
提交时间 2017-08-15 22:54:51 内存使用 19.39 MiB
显示代码纯文本
#include<bits/stdc++.h>/*每一位是独立的,所以可以一位一位看,看它取什么可以在一系列操作之后得到1,最后将这些结果合并*/
using namespace std;
int n,m,a[100005][50],b[50];
int pd(int x,int y){
	for(int i=1;i<=n;i++){
		if(a[i][0]==1)y&=a[i][x];
		if(a[i][0]==2)y|=a[i][x];
		if(a[i][0]==3)y^=a[i][x];
	}
	return y;
}
int main()
{
	freopen("sleep.in","r",stdin);
	freopen("sleep.out","w",stdout);
//	freopen("1.txt","r",stdin);
	scanf("%d%d",&n,&m);
	b[0]=1;
	int M=m;
	for(int i=1;i<=30;i++)
	b[i]=b[i-1]<<1;
	for(int i=1;i<=n;i++){
		char c[10];
		int x,h=0;
		scanf("%s%d",c,&x);
		if(c[0]=='A')a[i][0]=1;
		if(c[0]=='O')a[i][0]=2;
		if(c[0]=='X')a[i][0]=3;
		m=max(m,x);//这里要取出最大的值,后面求出它的最高位是什么,而不是m的最高位,因为m不一定是最大得数,比m最高位还要高的位取0时,通过一系列操作可能出现1,所以需要考虑,也就是取最大值的最高位,再高的话全是0无需考虑 
		while(x){
			a[i][++h]=x%2;
			x/=2;
		}
	}
	int h=0;
	while(m){
		h++;
		m/=2;
	}
	int ans=0;
	for(int i=h;i>=1;i--){
		int tem1=pd(i,1);
		int tem2=pd(i,0);
		if(tem2==1){//贪心的思想,不花费就可以得到1那就直接弄,花费能得到1,如果在允许范围内就花费,因为高位的1比地位所有全是1还要大,不然不进行操作 
			ans+=b[i-1];
		}
		else if(tem1==1&&M-b[i-1]>=0){
			ans+=b[i-1];
			M-=b[i-1];
		}
	}
	cout<<ans;
	return 0;
}