mashup链接:https://codeforces.com/gym/518192
A. Friendly Arrays
经典位运算,这里有个小trick,就是涉及到逻辑运算符的都把每一位拆开来看看影响
根据或运算的性质,对于a数列每个数的某一位来说,如果b数组中某个数在这一位上有1,那么在a数组的每个数的这一位都能保证变为1。而在后面按位异或时,如果a数列的长度为奇数,那么最后该位为1,偶数则为0.将这个操作类推到每一位,我们可以发现:如果a数列长度为奇数,通过任意次的或运算尽可能制造1,最后的异或和能达到最大,不操作则为最小。反过来,如果为偶数,不操作为最大,尽可能操作则为最小。
这里我们可以做一个预处理,在b数组输入时逐个进行或运算,然后得到一个含有最多1的数对a数组的数进行或运算。然后循环处理a数组即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
void solve(){
ll n,m; cin>>n>>m;
vector<ll> a(n+1),b(m+1);
ll ans=0;
for(ll i=1;i<=n;i++){
cin>>a[i];
ans^=a[i];
}
ll k=0;
for(ll i=1;i<=m;i++) {
cin>>b[i];
k|=b[i];
}
ll res=0;
for(ll i=1;i<=n;i++){
a[i]|=k;
res^=a[i];
}
if(n%2==0) cout<<res<<" "<<ans<<"\n";
else cout<<ans<<" "<<res<<"\n";
}
signed main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
int t;
cin>>t;
while(t--) {
solve();
}
}