题意:给出长度为n-1的序列a,b,问是否存在满足题中关系的长度为n的t?
打表得i|j和i&j的结果 得到(i|j)+(i&j)=i+j 对应到题目中是 即为,知道三者另一个就固定了。因此我们枚举t1,判断是否能找到合法的t序列。
时间复杂度 O(4*n)
枚举t[1],通过a[1]+b[1]-t[1]得到t[2],判断t[1]|t[2]?=a[1], t[1]&t[2]?=b[1]
#include<iostream>
#include<set>
using namespace std;
const int N=1e5+10;
int a[N];
int b[N];
int t[N];
int n;
int flag;
void pre()
{
for(int i=0;i<=3;++i)
{
cout<<i<<": ";
for(int j=0;j<=3;++j)
{
cout<<(i|j)<<' ';
}
cout<<endl;
}
for(int i=0;i<=3;++i)
{
cout<<i<<": ";
for(int j=0;j<=3;++j)
{
cout<<(i&j)<<' ';
}
cout<<endl;
}
}
int main()
{
//pre();
cin>>n;
n-=1;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=n;++i) cin>>b[i];
for(int i=0;i<=3;++i)
{
t[1]=i;
flag=1;
for(int j=1;j<=n;++j)
{
t[j+1]=a[j]+b[j]-t[j];
if((t[j]|t[j+1])!=a[j]) {flag=0;break;}
if((t[j]&t[j+1])!=b[j]) {flag=0;break;}
if(!flag) break;
}
if(flag)
{
cout<<"YES"<<endl;
for(int k=1;k<=n+1;++k)
{
if(k!=1) cout<<' ';
cout<<t[k];
}
return 0;
}
}
cout<<"NO"<<endl;
return 0;
}