[异或] cf1572b
套路:放在异或前缀和数组上讨论。
于是
性质
性质
由性质
由于无论怎么操作
代码
注意一个细节:
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int t, n, a[N], b[N], n_;
inline void solve(){
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]), a[i] ^= a[i - 1];
if(a[n]) {printf("No\n"); return ;}
n_ = 0;
for(int i = n - 1; i >= 0; i -= 2)
if(!a[i]){
for(int j = i - 2; j >= 1; j -= 2) if(j + 2 <= n) b[++n_] = j, a[j] = a[j + 2], a[j + 1] = a[j - 1];
for(int j = i + 1; j <= n; j += 2) if(j + 2 <= n) b[++n_] = j, a[j] = a[j + 2], a[j + 1] = a[j - 1];
break;
}
for(int i = n - 2; i >= 1; i -= 2) if(i + 2 <= n) b[++n_] = i, a[i] = a[i + 2], a[i + 1] = a[i - 1];
for(int i = 1; i <= n; ++i)
if(a[i]) {printf("No\n"); return ;}
printf("Yes\n%d\n", n_);
for(int i = 1; i <= n_; ++i) printf("%d ", b[i]);
printf("\n");
}
int main(){
cin >> t;
while(t--) solve();
return 0;
}