由题目观察可得,a[m+1]=a[i]^...a[m],,结合异或的性质a^b^a=b,可得如果在末尾添加一个a[m+1],a[m+1]会和末尾几个抵消掉,求得i~k这一段的异或和,k<m,因此通过该操作实际上我就可以求得所有长度连续区间的异或和,求其最大值,n=1e5+10,如果暴力求解肯定会超时,我们观察发现a[i]的范围为0~2^8,因此异或和最多不超过2^8,因此我们从a[i]方向考虑
根据异或的性质可得sum[i~j]=sum[j]^sum[i],其中sum的数值为0~2^8,两层循环的话,最多为2^9时间复杂度
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <set>
#include <utility>
#include <vector>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,t;
int a[N];
bool p[N];
void solve(){
memset(p,0,sizeof p);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int res=0,sum;
for(int i=1;i<=n;i++){//我们枚举每个sum[i]
if(i>1) sum^=a[i];
else sum=a[i];
res=max(sum,res);
p[sum]=1;
for(int j=0;j<2<<8;j++){//枚举前面出现过的sum[i]
if(p[j]){
res=max(res,sum^j);
}
}
}
cout<<res<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>t;
while(t--){
solve();
}
}
区间和的范围和元素范围密切相关
- Codeforces Vampiric Powers anyone Roundcodeforces vampiric powers anyone educational codeforces round rated codeforces round 911 div codeforces round 864 div codeforces round 887 div codeforces round 863 div codeforces round 913 div codeforces round 915 div codeforces round 917 div codeforces round 912 div