题目:#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,求助大佬这是什么原因