题目描述
给你两个序列,他们分别是由同一个序列a中的每个数和前一个数相与,相或得到的(第一项是a1&0,a1|0),让你求出这个原序列。已知原序列第一个数字是0
输入
第一行一个整数N(2<=N<=500000),代表序列长度
第二行N个数字,代表第一个序列(第一项是a1&0,第二项是a2&a1,以此类推)每个数字a满足0<=a<=500000
第三行N个数字,代表第二个序列(第一项是a1|0,第二项是a2|a1,以此类推)每个数字a满足0<=a<=500000
输出
原序列,长度为N+1
样例输入
4 0 144 0 552 728 987 959 957
样例输出
0 728 403 556 953
题解:
刚看到题时,觉得他们其中有规律,于是手动计算了
729|987=987 728&987=728
并且987-728+144=403!!!!!于是规律出现!!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5e5 + 7;
int a[maxn];
int b[maxn];
int c[maxn];
bool cmp(int a,int b) {
return a>b;
}
int main() {
int n;
cin>>n;
for(int i=0; i<n; i++)cin>>a[i];
for(int i=0; i<n; i++)cin>>b[i];
c[0]=0;
c[1]=b[0];
for(int i=2; i<n+1; i++) {
int x,y;
x=a[i-1];
y=(c[i-1]|b[i-1])-(c[i-1]&b[i-1]);
// cout<<x<<" "<<y;
c[i]=x+y;
// cout<<"--------"<<c[i]<<endl;
}
for(int i=0; i<n+1; i++)cout<<c[i]<<" ";
}
错了好多次,|&比-优先级低。。。