传送门
初看这道题的时候没有什么思路,看了别人的题解后,才发现时增加的位运算关系不太懂
题目大意:给定你n个数(a1,a2…an),让你求出n个数(b1,b2…bn),使得序列(a1 ^ b1,a2 ^ b2…an ^ bn)符合题目要求的共同增长序列
在写这道题之前很有必要复习(学习)一下位运算
借鉴博客
&(按位与)
参加运算的两个二进制数,同时为1,才为1,否则为0。举例 3&5=1。
|(按位或)
参加运算的两个二进制数,一个为1就为1,否则为0。2 | 4=6
^(按位异或)
参加运算的两个二进制数,位不同则为1,位相同则为0。6^7=1
解法:就是让这个数 或 之前公共序列的数,然后求得的数就是最后两个数异或的结果,然后将这个数 异或 a[i],就能求出相应的b[I];
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<queue>
#include<stack>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int N=2e5+10;
int a[N];
int b[N];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
int x=a[i];
a[i]=a[i]|a[i-1];
b[i]=a[i]^x;
}
for(int i=1;i<=n;i++){
printf("%d ",b[i]);
}
cout<<"\n";
}
}