#include<bits/stdc++.h>
#define N 100010
using namespace std;
//b、c预处理:从前往后异或,从后往前异或
//b[i]存储a[0]~a[i-1]的异或和,c[i]存储a[i+1]~a[x-1]的异或和
unsigned int a[N],b[N],c[N];
int t,x,k;
int main(){
cin>>t;
while(t--){
cin>>x>>k;
for(int i=0;i<x;i++) cin>>a[i];
if(k%2!=0){//奇:特殊处理
b[0]=a[0],c[x-1]=a[x-1];
for(int i=1;i<x;i++) b[i]=b[i-1]^a[i];
for(int j=x-2;j>=0;j--) c[j]=c[j+1]^a[j];
//0、x-1
a[0]=c[1],a[x-1]=b[x-2];
//1~x-2
for(int i=1;i<x-1;i++){
a[i]=b[i-1]^c[i+1];
}
}
for(int i=0;i<x-1;i++) cout<<a[i]<<' ';
cout<<a[x-1];
}
return 0;
}
我的想法是k为偶的时候直接输出,奇的时候先预处理。 预处理的方法是:用b[i]存储a[0]~a[i-1]的异或和,c[i]存储a[i+1]~a[x-1]的异或和。
最终第i位的异或积就是a[i]=b[i-1]^c[i+1]。
请问带佬们,是我的想法错了还是代码实现错了哇,小样例对了但是大样例错了,一测评结果全WA掉了555(大悲)