从题目意思我们可以推测出这是一道求最大连续子异或和的题目,那么一般情况来讲要枚举l,r两端,时间复杂度为n^2,超时了,所以我们考虑一下优化,那么想到最多a为2^8那么因此我们可以采用桶来存储,首先求出所有数的异或前缀和,那么我们要求的答案就是xi^xj(表示任意两个异或前缀和的异或值),然后将所有的异或前缀和加入到桶当中,遍历数组,然后再遍历桶(记住:不能遍历两次桶,因为多组测试数据会tle),如果桶中的数存在,那么就比较大小。
代码附上:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+5;
int a[N];
int vis[N];
int pre[N];
int n;
void solve(){
cin>>n;
for(int i=0;i<(1<<9);i++)vis[i]=0;
for(int i=0;i<=n;i++){
pre[i]=0;
}
for(int i=1;i<=n;i++)cin>>a[i];
vis[0]++;
for(int i=1;i<=n;i++){
pre[i]=pre[i-1]^a[i];
vis[pre[i]]++;
}
int max1=0;
for(int i=1;i<=n;i++){
for(int j=0;j<(1<<9);j++){
if(vis[j]){
max1=max(max1,pre[i]^j);
//cout<<"i="<<pre[i]<<" j="<<j<<"\n";
}
}
}
cout<<max1<<"\n";
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
solve();
}
return 0;
}