CF#717 div2

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;
	}
}
  
原文地址:https://www.cnblogs.com/lingshi321/p/14708221.html