分析

最开始看到还以为是一个可持久化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;
}