位运算和枚举
思路
首先明确
\[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
浙公网安备 33010602011771号