题目链接
When Masha came to math classes today, she saw two integer sequences of length n?1 on the blackboard. Let’s denote the elements of the first sequence as ai (0≤ai≤3)
, and the elements of the second sequence as bi (0≤bi≤3)
.
Masha became interested if or not there is an integer sequence of length n, which elements we will denote as ti (0≤ti≤3)
, so that for every i (1≤i≤n?1)
the following is true:
ai=ti|ti+1
(where | denotes the bitwise OR operation) and
bi=ti&ti+1
(where & denotes the bitwise AND operation).
The question appeared to be too difficult for Masha, so now she asked you to check whether such a sequence ti of length n exists. If it exists, find such a sequence. If there are multiple such sequences, find any of them.
Input
The first line contains a single integer n (2≤n≤10
5
) — the length of the sequence ti
.
The second line contains n?1
integers a1,a2,…,an?1 (0≤ai≤3)
— the first sequence on the blackboard.
The third line contains n?1
integers b1,b2,…,bn?1 (0≤bi≤3)
— the second sequence on the blackboard.
Output
In the first line print “YES” (without quotes), if there is a sequence ti that satisfies the conditions from the statements, and “NO” (without quotes), if there is no such sequence.
If there is such a sequence, on the second line print n integers t1,t2,…,tn (0≤ti≤3)
— the sequence that satisfies the statements conditions.
If there are multiple answers, print any of them.
input
4
3 3 2
1 2 0
output
YES
1 3 2 0
input
3
1 3
3 2
output
NO
Note
In the first example it’s easy to see that the sequence from output satisfies the given conditions:
t1|t2=(012)|(112)=(112)=3=a1 and t1&t2=(012)&(112)=(012)=1=b1;
t2|t3=(112)|(102)=(112)=3=a2 and t2&t3=(112)&(102)=(102)=2=b2;
t3|t4=(102)|(002)=(102)=2=a3 and t3&t4=(102)&(002)=(002)=0=b3.
In the second example there is no such sequence.
题解: 位运算一个性质
a | b = c
a ^ b = d
已知a,c,d ,求b b = c + d - a
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n,flag,a[N],b[N],res[N];
int main(){
ios :: sync_with_stdio(false);cin.tie(0);cin >> n;for(int i = 0;i < n - 1;i++) cin >> a[i];for(int i = 0;i < n - 1;i++) cin >> b[i];for(int i = 0;i <= 3;i++){
res[0] = i,flag = true;for(int j = 1;j < n;j++){
res[j] = if((res[j] | res[j - 1]) != a[j - 1] || (res[j] & res[j - 1]) != b[j - 1]){
flag = false;break;}}if(flag == true){
cout << "YES" << endl;for(int j = 0;j < n;j++) cout << res[j] << " ";return 0;}}cout << "NO" << endl;return 0;
}