位运算和枚举

思路

首先明确

\[A+B=A|B + A\&B \]

因为加法性质没有位运算来得好,我们把数据处理一下就得到了待求数组相邻两位的与和或,因为确定了第一个数 \(a1\) 就是确立了整个序列,所以我们依次枚举 \(a1\) 的每一位为0或1就可以了,时间复杂度为 \(O(an)\)(应该吧)

#include<iostream>
using namespace std;
const int MAXN=100010;
int n;int b[MAXN],c[MAXN],d[MAXN];//d=c-b=ai&ai-1;b=ai|ai-1
bool check(int index,int val){
	for(int i=1;i<n;i++){
		int orr=(b[i]&1),andd=(d[i]&1);
		if(val==0&&andd==1) return false;
		if(val==1&&orr==0) return false;
		if(val==0&&andd==0) {val=orr;continue;}
		if(val==1&&orr==1) {val=andd;continue;}
	}
	return true;
}
int main()
{
	cin>>n;
	for(int i=1;i<n;i++)
		scanf("%d",&b[i]);
	for(int i=1;i<n;i++){
		scanf("%d",&c[i]);
		d[i]=c[i]-b[i];
	}
	int ans=1;
	for (int i = 1; i <=31 ; i++){
		ans*=(check(i,0)+check(i,1));
		if(ans==0) break;
		for(int j=1;j<n;j++)
			b[j]>>=1,d[j]>>=1;
	}

	cout<<ans;
    system("pause");
    return 0;
}
 posted on 2021-08-26 09:53  Stuart_Assassins  阅读(56)  评论(0)    收藏  举报