关于玄学样例
查看原帖
关于玄学样例
571143
cloud2764scallop_eve楼主2023/12/3 20:23

题目:#10051. 「一本通 2.3 例 3」Nikitosh 和异或

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N = 400005, M = 15000005;
int n, ans, t, cnt;
int a[N], l[N], r[N], p[35], s[M][2];
void add(int x) {
	int sum = -1;
	while (x) {
		p[++sum] = x & 1;
		x >>= 1;
	}
	for (int i = 33, j = 0; i >= 0; i--) {
		if (!s[j][p[i]]) s[j][p[i]] = ++cnt;
		j = s[j][p[i]];
	}
	return ;
}
int find(int x) {
	int sum = 0, j = 0;
	for (int i = 32; i >= 0; i--) {
		if (s[j][1 - p[i]]) {
			sum += (1 << i);
			j = s[j][1 - p[i]];
		} else j = s[j][p[i]];
	}
	return sum;
}
void init() {
	ans = 0, t = 0, cnt = 0;
	memset(s, 0, sizeof(s));
	memset(p, 0, sizeof(p));
}
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	init();
	for (int i = 1; i <= n; i++) {
		memset(p, 0, sizeof(p));
		t ^= a[i], add(t);
		l[i] = max(l[i - 1], find(t));
	}
	init();
	for (int i = n; i; i--) {
		memset(p, 0, sizeof(p));
		t ^= a[i], add(t);
		r[i] = max(r[i + 1], find(t));
	}
	for (int i = 1; i < n; i++)
		ans = max(ans, l[i] + r[i + 1]);
	printf("%d", ans);
	return 0;
}

在代码的第12行,如果将 for (int i = 33, j = 0; i >= 0; i--) 改为 for (int i = 32, j = 0; i >= 0; i--) 就过不了样例,但是都可以 AC,求助大佬这是什么原因

2023/12/3 20:23
加载中...