高难度运算——位运算

高难度运算

题目描述

给你两个序列,他们分别是由同一个序列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]<<" ";


}

错了好多次,|&比-优先级低。。。

Guess you like

Origin blog.csdn.net/qq_53950686/article/details/121481054