B. AGAGA XOOORRR
题目问我们能否将一个数组通过,对相邻的两个数进行xor变成相同的数,至少为2个。
首先我们要知道xor的一些性质。
对一个相同的数进行2次xor,相当于没有进行操作。这一点很重要,意味着我们可以利用前缀和,将前i个数的xor存起来,i+1到j元素的xor就等于是s[j]^s[i]
如果满足题意,最后剩的数可以认为只有2个或者3个,如果是4个相同的,两两xor会变成2个。
代码
const int N = 2005;
int s[N];
int main()
{
ios::sync_with_stdio(false); cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
cin >> s[1];
rep(i, 2, n) {
int tmp;
cin >> tmp;
s[i] = s[i - 1] ^ tmp;
}
bool flag = false;
rep(i, 1, n - 1) {
if (s[i] == (s[n] ^ s[i])) {
flag = true;
break;
}
}
if (flag) {
cout << "YES" << endl;
continue;
}
rep(i, 1, n - 2) {
rep(j, i + 1, n - 1) {
if (s[i] == (s[j] ^ s[i]) && s[i] == (s[n] ^ s[j])) {
flag = true;
break;
}
}
}
if (flag) {
cout << "YES" << endl;
}
else
cout << "NO" << endl;
}
}