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