60 分求助
查看原帖
60 分求助
866154
fcy20180201楼主2023/12/6 21:53

记录

#include<bits/stdc++.h>
using namespace std;
int n,a[50005],b[50005],to[50005],lst[50005],nxt[50005],ans;
int root[50005],sn[5000005][2],mx[5000005],rest;

void insert(int id,int bit,int p,int q){
	if(bit<0){mx[q]=id;return ;}
	bool x=(a[id]>>bit)&1;
	sn[q][0]=sn[p][0],sn[q][1]=sn[p][1],sn[q][x]=++rest;
	insert(id,bit-1,sn[p][x],sn[q][x]);
	mx[q]=max(mx[sn[q][0]],mx[sn[q][1]]);
	return ;
}

int main(){
	scanf("%d",&n);
	memset(mx,-1,sizeof(mx));
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]),b[i]=a[i],root[i]=++rest;
		insert(i,30,root[i-1],root[i]);
	}
	sort(b+1,b+n+1);
	nxt[0]=1,lst[n+1]=n;
	for(int i=1;i<=n;i++)to[lower_bound(b+1,b+n+1,a[i])-b]=i,lst[i]=i-1,nxt[i]=i+1;
	for(int i=1;i<n;i++){
		int res=0;
		for(int bit=30,cur=root[min(n,nxt[to[i]])];~bit;bit--){
			bool x=(a[to[i]]>>bit)&1;res<<=1;
			if(mx[sn[cur][!x]]>=lst[to[i]])res|=1,cur=sn[cur][!x];
			else cur=sn[cur][x];	
		}
		ans=max(ans,res);
		nxt[lst[to[i]]]=nxt[to[i]],lst[nxt[to[i]]]=lst[to[i]];
	}
	printf("%d",ans);
	return 0;
}
2023/12/6 21:53
加载中...