1. 程式人生 > 實用技巧 >起床困難綜合症

起床困難綜合症

題目

題目

題解

位運算一個很重要的性質,位與位之間不會互相影響。

我採用的做法是從大到小判斷每一位取多少結果是\(1\)

時間複雜度:\(O(nlogn)\)

對於每一位我們暴力代\(1\)\(0\)進去,然後看結果是不是\(1\)就行了,如果都是\(1\)我們這一位優先取\(0\),給後面的點創造更多可以選擇的空間。

程式碼

#include<cstdio>
#include<cstring>
#define  N  110000
using  namespace  std;
struct  node
{
	int  type,x;
}a[N];int  n,m;
int  ans=0;//答案 
bool  pd(int  x,int  k/*第k位是不是1*/)
{
	for(int  i=1;i<=n;i++)
	{
		if(a[i].type==1)x&=a[i].x;
		else  if(a[i].type==2)x|=a[i].x;
		else  x^=a[i].x;
	}
	return  x&(1<<k);
}
int  main() 
{
	scanf("%d%d",&n,&m);
	for(int  i=1;i<=n;i++)
	{
		char  st[10];scanf("%s",st+1);
		scanf("%d",&a[i].x);
		if(st[1]=='A')a[i].type=1;
		else  if(st[1]=='O')a[i].type=2;
		else  a[i].type=3;
	}
	for(int  i=30;i>=0;i--)
	{
		if(pd(0,i)==1)ans+=(1<<i);
		else  if((1<<i)<=m/*要判斷數字是否在1-m範圍內*/  &&  pd((1<<i),i)==1)ans+=(1<<i),m-=(1<<i);
	}
	printf("%d\n",ans);
	return  0;
}