奶牛异或
关键
很明显的找异或最大值的问题,从前面开始往后面找一个最大值。
但如果直接模拟,就需要一个删除操作,所以可以从后面开始操作,先确定右端点就可以了
也就是稍微转换一下就可以了
代码
#include <bits/stdc++.h>
using namespace std;
const int M=1e5+5;
int ch[M*21][2],tot;
void insert(int x) {
int p=0;
for(int i=20;i>=0;i--) {
int v=x>>i&1;
if(ch[p][v]==0)ch[p][v]=++tot;
p=ch[p][v];
}
}
int find(int x) {
int p=0,ans=0;
for(int i=20;i>=0;i--) {
int v=x>>i&1;
if(ch[p][v^1])p=ch[p][v^1],ans|=1<<i;
else p=ch[p][v];
}
return ans;
}
int a[M];
int main() {
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n;cin>>n;
int ans=-1,l,r;
insert(0);
//先确定右端点,这样子就可以避免删除的操作
for(int i=1;i<=n;i++) {
int x;cin>>x;
a[i]=a[i-1]^x;
}
for(int i=1;i<=n;i++) {
int x=find(a[i]);
if(x>ans)ans=x,r=i;
insert(a[i]);
}
for(int i=r-1;i>=0;i--)
if((a[i]^a[r])==ans){l=i+1;break;}
cout<<ans<<' '<<l<<' '<<r<<endl;
return 0;
}

浙公网安备 33010602011771号