题目思路:
数据结构进阶,Trie树,也叫字典树,顾名思义,就是一个像字典一样的树。
我们用边来存储信息,那么一条边有哪些要存储的呢?起点,终点,题目里面要存的东西,可以参考网页:https://oiwiki.org/string/trie/ 中的讲解,如果你对如何用数组模拟链表有所了解,那就更好理解了
那么这道题,相当于求最大异或区间,就非常简单了,求每个区间的异或前缀和,然后在遍历寻找每一个前缀的最大异或对,相异或就得到最大异或区间。
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 100005;
const int MOD = 998244353;
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int ch[maxn][2], cnt[maxn], idx, ans;
void insert(int x) {
int p = 0;
for (int i = 10; i >= 0; i--) {
int b = x >> i & 1;
if (!ch[p][b])ch[p][b] = ++idx;
p = ch[p][b];
}
cnt[p] = x;
}
void query(int x) {
int p = 0;
for (int i = 10; i >= 0; i--) {
int b = x >> i & 1;
if (ch[p][b ^ 1])p = ch[p][b ^ 1];
else p = ch[p][b];
}
ans = max(ans, x ^ cnt[p]);
}
void init() {
memset(ch, 0, sizeof(ch));
idx = 0;
ans = 0;
memset(cnt, 0, sizeof(cnt));
}
inline void solve() {
int n; cin >> n;
vector<int>a(n + 1);
init();
for (int i = 1; i <= n; i++) {
cin >> a[i];
a[i] ^= a[i - 1];
}
for (int i = 1; i <= n; i++) {
insert(a[i]);
}
for (int i = 0; i <= n; i++) {
query(a[i]);
}
cout << ans << '\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
std::cout.tie(0);
int t = 1;
cin >> t;
while (t--)
solve();
return 0;
}