正确解题
2026-10-17 13:49:04
发布于:浙江
0阅读
0回复
0点赞
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 400005;
const int BITS = 31;
int trie[MAXN * 32][2], tot;
int pre[MAXN], leftMax[MAXN], rightMax[MAXN];
void insert(int x) {
int node = 0;
for (int i = BITS - 1; i >= 0; i--) {
int bit = (x >> i) & 1;
if (!trie[node][bit]) {
trie[node][bit] = ++tot;
}
node = trie[node][bit];
}
}
int query(int x) {
int node = 0, res = 0;
for (int i = BITS - 1; i >= 0; i--) {
int bit = (x >> i) & 1;
if (trie[node][bit ^ 1]) {
res |= (1 << i);
node = trie[node][bit ^ 1];
} else {
node = trie[node][bit];
}
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
pre[i] = pre[i - 1] ^ x;
}
// 从左到右,计算 leftMax[i]
tot = 0;
memset(trie, 0, sizeof(trie));
insert(pre[0]);
leftMax[0] = 0;
for (int i = 1; i <= n; i++) {
leftMax[i] = max(leftMax[i - 1], query(pre[i]));
insert(pre[i]);
}
// 从右到左,计算 rightMax[i]
tot = 0;
memset(trie, 0, sizeof(trie));
insert(pre[n]);
rightMax[n + 1] = 0;
for (int i = n; i >= 1; i--) {
rightMax[i] = max(rightMax[i + 1], query(pre[i - 1]));
insert(pre[i - 1]);
}
// 枚举分割点
int ans = 0;
for (int i = 1; i < n; i++) {
ans = max(ans, leftMax[i] + rightMax[i + 1]);
}
cout << ans << endl;
return 0;
}
这里空空如也



有帮助,赞一个