题目大意:求不相交的两段区间,两段的异或和加起来最大是多少

区间异或和记得转化成前缀和啊我个sb

变成一对数的异或值就变成trie了啊

两段区间的话,从左往右一颗trie,从右往左一颗trie

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
using namespace std;
typedef long long LL;
const int N=400007;
const int M=12000007;
const int B=30;
inline int rd(){
    int x=0;bool f=1;char c=getchar();
    for(;!isdigit(c);c=getchar())if(c=='-')f=0;
    for(;isdigit(c);c=getchar())x=x*10+c-48;
    return x;
}

int n;
int a[N];
int tot;
int tl[N];
int tr[N];
int ch[M][2];

void ins(int d){
    int x=0,k;
    for(int i=B;i>=0;i--){
        k=(d>>i)&1;
        if(ch[x][k]==0) x=ch[x][k]=++tot;
        else x=ch[x][k];
    }
}

int get(int d){
    int x=0,k;
    int res=0;
    for(int i=B;i>=0;i--){
        k=((d>>i)&1)^1;
        if(ch[x][k]){
            x=ch[x][k];
            res+=(1<<i);
        }
        else x=ch[x][k^1];
    }
    return res;
}

int main(){
    freopen("a.txt","r",stdin);
    int i;
    n=rd();
    for(i=1;i<=n;i++) a[i]=rd();
    for(i=2;i<=n;i++) a[i]^=a[i-1];
    tot=0;
    ins(0);
    for(i=1;i<=n;i++){
        tl[i]=get(a[i]);
        ins(a[i]);
    }
    tot=0;
    ins(0);
    memset(ch,0,sizeof(ch));
    for(i=n;i>0;i--){
        tr[i]=get(a[i]);
        ins(a[i]);
    }
    int ans=0;
    for(i=n-1;i>0;i--){
        ans=max(ans,tr[i+1]+tl[i]);
        tr[i]=max(tr[i],tr[i+1]);
    }
    printf("%d\n",ans);
    return 0;
}

bzoj4260的更多相关文章

  1. 【BZOJ4260】Codechef REBXOR (Trie树)

    [BZOJ4260]Codechef REBXOR (Trie树) 题面 BZOJ 题解 两眼题.第一眼不会做,第二眼好简单... 前缀异或和一下,拿\(Trie\)树维护求一个在这个端点以左的最大值 ...

  2. [BZOJ4260]Codechef REBXOR(Trie)

    Trie模板题.求出每个前缀和后缀的最大异或和区间,枚举断点就可.不知为何跑得飞快. #include<cstdio> #include<cstring> #include&l ...

  3. BZOJ4260 Codechef REBXOR(trie)

    用trie求出前缀最大区间异或和.后缀最大区间异或和即可.注意空间是nlog的. #include<iostream> #include<cstdio> #include< ...

  4. 【BZOJ4260】Codechef REBXOR Trie树+贪心

    [BZOJ4260]Codechef REBXOR Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN. Output ...

  5. BZOJ4260 Codechef REBXOR 题解

    题目大意: 有一个长度为n的序列,求1≤l1≤r1<l2≤r2≤n使得(⊕r1i=l1ai)+(⊕r2i=l2ai)最大,输出这个最大值. 思路: 用Trie求出前缀异或和以及后缀异或和,再求出 ...

  6. 【BZOJ4260】 Codechef REBXOR 可持久化Trie

    看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...

  7. BZOJ4260: Codechef REBXOR

    Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN.     Output 输出一行包含给定表达式可能的最大值.   S ...

  8. BZOJ4260,LOJ10051 Nikitosh 和异或

    题意 给定一个含 \(N\) 个元素的数组 \(A\),下标从 \(1\) 开始.请找出下面式子的最大值:\((A[l_1]\bigoplus A[l_1+1]\bigoplus -\bigoplus ...

  9. BZOJ4260: Codechef REBXOR (01Tire树)

    题意 题目链接 Sol 首先维护出前缀xor和后缀xor 对每个位置的元素插入到Trie树里面,每次找到和该前缀xor起来最大的元素 正反各做一遍,取最大. 记得要开log倍空间qwq.. #incl ...

随机推荐

  1. Spring Boot 添加Shiro支持

    前言: Shiro是一个权限.会话管理的开源Java安全框架:Spring Boot集成Shiro后可以方便的使用Session: 工程概述: (工程结构图) 一.建立Spring Boot工程 参照 ...

  2. 即使用ADO.NET,也要轻量级动态生成更新SQL,比Ormlite性能更高

    先上测试结果: //测试1000次针对同一个表同一个字段更新,比Ormlite平均快2.34倍 //生成SQL+ExecuteNonQuery Ormlite 倍数 //6513ms 15158ms ...

  3. remove ---会报错discard不会报错

    s = {1,2,3,4,5,6,'sn','7'} s.remove('hellfjsdjfsjdfljsdl')#删除元素不纯在会报错 print(s) s.discard("sbbbb ...

  4. c# Newtonsoft.Json序列化和反序列 js解析

    Newtonsoft.Json下载地址:http://www.newtonsoft.com/products/json/ 参考:      http://www.cnblogs.com/yanweid ...

  5. windows下编译chromium浏览器的15个流程整理

    编译chromium 系统为windows, 国内在windows上编译chromium的资料比较少, 我这篇文章只能作为参考, 记录我遇到的一些问题,因为chromium团队也会修改了代码,或者编译 ...

  6. git-添加公钥

    安装完git后,打开开git bush 输入以下命令 git config --global user.name "Your Name" git config --global u ...

  7. RabbitMQ Lazy Queue 延迟加载

    Lazy Queue 在著名的单例设计模式中就有懒汉式的实现方式,也就是只有在你需要的时候我才去加载. 这让博主想到了以前上学的时候,每到了假期的假期作业,在假期的时候是从来不做的.只有在快开学老师要 ...

  8. python学习笔记-(十五)RabbitMQ队列

    rabbitMQ是消息队列:想想之前的我们学过队列queue:threading queue(线程queue,多个线程之间进行数据交互).进程queue(父进程与子进程进行交互或者同属于同一父进程下的 ...

  9. js轮播(qq幻灯片效果)

    <!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equ ...

  10. C#环境