分析
最开始看到还以为是一个可持久化01Trie树模板题。。。
结果发现好像就是持续更新一个Trie树加上查询即可
由于是连续子序列,所以直接异或前缀即可
时间复杂度:
代码
//Nowcoder 22998
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define LL long long
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(int i=A;i<=B;i++)
#define BOR(i,A,B) for(int i=A;i>=B;i--)
#define Debug(X) cerr<<#X<<" = "<<X<<" "
#define Lowbit(X) (X & (-X))
#define Skip cout<<endl;
#define INF 0x3f3f3f3f
#define Mod 998244353
#define Rson (X<<1|1)
#define Lson (X<<1)
using namespace std;
const int MaxN=8e5+10,MaxM=22;
int i,cnt,tree[MaxN][2],Num[MaxM],num[MaxN],sum[100005],Total;
inline void insert(int k,int s) {
if(s==MaxM){num[k]=i;return;}
int x=Num[s];
if(tree[k][x]) insert(tree[k][x],s+1);
else{
tree[k][x]=++cnt;
insert(cnt,s+1);
}
}
inline int find(int k,int s) {
int x=Num[s];
if(tree[k][x^1]) return find(tree[k][x^1],s+1);
if(tree[k][x]) return find(tree[k][x],s+1);
return num[k];
}
int main() {
scanf("%d",&Total);
int ans=-1,Left,Right;cnt=0;
for(i=1;i<=Total;++i) {
int x,p=0;
scanf("%d",&x);
sum[i]=sum[i-1]^x;
x=sum[i];
while(p<MaxM-1) Num[++p]=x&1,x>>=1;
for(int j=1;j<=(p>>1);++j) swap(Num[j],Num[p+1-j]);
int y=find(0,1);
if((sum[i]^sum[y])>ans){
Left=y+1;
Right=i;
ans=sum[i]^sum[y];
}
insert(0,1);
}
printf("%d %d %d\n",ans,Left,Right);
system("pause");
return 0;
} 
京公网安备 11010502036488号