奶牛异或

奶牛异或

关键

很明显的找异或最大值的问题,从前面开始往后面找一个最大值。
但如果直接模拟,就需要一个删除操作,所以可以从后面开始操作,先确定右端点就可以了
也就是稍微转换一下就可以了

代码

#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;
}
posted @ 2023-01-13 21:31  basicecho  阅读(37)  评论(0)    收藏  举报