题目大意:

  有一个长度为n的序列,求1≤l1≤r1<l2≤r2≤n使得(⊕r1i=l1ai)+(⊕r2i=l2ai)最大,输出这个最大值。

思路:

  用Trie求出前缀异或和以及后缀异或和,再求出前缀异或和以及后缀异或和中最大的,前后相加,求最大值。用可持久化Trie求异或和也可(较慢)。

代码:

Trie:

 #include<cstdio>
#include<cstring>
#include<iostream>
#define M 400009
using namespace std;
int cnt,ans,child[M<<][],a[M],lmax[M],rmax[M]; void build(int x)
{
int i,w,now=;
for (i=<<;i;i>>=)
{
w=(x&i)?:;
if (!child[now][w]) child[now][w]=++cnt;
now=child[now][w];
}
} int cal(int x)
{
int i,w,now=,ans=;
for (i=<<;i;i>>=)
{
w=(x&i)?:;
if (child[now][w]) ans+=i,now=child[now][w];
else now=child[now][!w];
}
return ans;
} int main()
{
int n,i,now; scanf("%d",&n);
for (i=;i<=n;i++) scanf("%d",&a[i]);
for (build(now=),i=;i<=n;i++)
{
build(now^=a[i]);
lmax[i]=max(cal(now),lmax[i-]);
}
memset(child,,sizeof(child));
for (build(now=cnt=),i=n;i;i--)
{
build(now^=a[i]);
rmax[i]=max(cal(now),rmax[i+]);
}
for (i=;i<=n;i++) ans=max(ans,lmax[i]+rmax[i+]);
printf("%d\n",ans);
return ;
}

可持久化Trie:

 #include<cstdio>
#include<iostream>
#define M 400009
using namespace std; int sum[M<<],lc[M<<],rc[M<<],a[M],root[M<<],cnt; int read()
{
int x=;
char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') x=(x<<)+(x<<)+ch-,ch=getchar();
return x;
} void build(int &cur,int _cur,int x,int k)
{
sum[cur=++cnt]=sum[_cur]+;if (k<) return;
if (x&(<<k)) lc[cur]=lc[_cur],build(rc[cur],rc[_cur],x,k-);
else rc[cur]=rc[_cur],build(lc[cur],lc[_cur],x,k-);
} int ask(int x,int y,int val)
{
int i,ans=;
for (i=;i>=;i--)
if (val&(<<i))
if (sum[lc[y]]-sum[lc[x]]) ans|=<<i,x=lc[x],y=lc[y];
else x=rc[x],y=rc[y];
else if (sum[rc[y]]-sum[rc[x]]) ans|=<<i,x=rc[x],y=rc[y];
else x=lc[x] ,y=lc[y];
return ans;
} int main()
{
int n=read(),i,mx=,ans=;
for (i=;i<=n;i++) a[i]=read()^a[i-];
for (i=;i<=n;i++) build(root[i],root[i-],a[i],);
for (i=n-;i;i--)
{
mx=max(mx,ask(root[i],root[n],a[i]));
ans=max(ans,mx+ask(root[],root[i],a[i]));
}
printf("%d",ans);
return ;
}

BZOJ4260 Codechef REBXOR 题解的更多相关文章

  1. [Bzoj4260]Codechef REBXOR(trie树)

    4260: Codechef REBXOR Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1534  Solved: 669[Submit][Stat ...

  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

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

  5. BZOJ4260: Codechef REBXOR (01Tire树)

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

  6. [BZOJ4260] Codechef REBXOR (01字典树,异或前缀和)

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

  7. 【BZOJ4260】Codechef REBXOR (Trie树)

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

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

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

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

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

随机推荐

  1. SQLServer操作结果集

    union组合结果集 --相同合并 union --全部显示 union all 公用表表达式 with CET( wName,dName) as ( select wName,dName from ...

  2. Asp.net窄屏页面 手机端新闻列表

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SearchNotice.a ...

  3. IE文档版本和文档流模式

    使用X-UA-Compatible来设置IE浏览器兼容模式 文件兼容性用于定义让IE如何编译你的网页.此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式. < ...

  4. <jsp:include>和<%@include file=""%>区别【131031】

    <jsp:include page=""> 父页面和包含进来的页面单独编译,单独翻译成servlet后,在前台拼成一个HTML页面. <%@include fil ...

  5. SPOJ220 Relevant Phrases of Annihilation(后缀数组)

    引用罗穗骞论文中的话: 先将n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组.然后二分答案,再将后缀分组.判断的时候,要看是否有一组后缀在每个原来的字符串中至少出现两次,并 ...

  6. AOP常用术语

    1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化前,类初始化后,类某个方法调用前,调用后,方法跑出异常后.一个类或一段程序代码拥有一些具有边界性质的特定点.这些代码中的特定点就 ...

  7. 2-05使用SQL语句创建数据库2

    使用SQL语句创建多个数据文件和日志文件: USE master--指向当前使用的数据库 GO--批处理的标志 CREATE DATABASE E_Market--创建E_market数据库 ON P ...

  8. 跟着鸟哥学Linux系列笔记0-扫盲之概念

    相关缩写全称: POSIX(Portable Operation System Interface):可携式操作系统接口,重点在于规范内核与应用之间的接口,由IEEE定义发布 IEEE: 美国电气与电 ...

  9. 源码方式安装mysql5.5

    mysql5.5开始,源码配置编译工具configure变成了cmake,所以先要去把cmake装上.并安装make,bison,cmake,gcc-c++,ncurses的包 去http://www ...

  10. linux系统定时任务

    crontab常用的几个命令如下 sudo crontab -l #显示所有的定时任务 sudo crontab -e #编辑任务 sudo crontab -r #删除所有的任务 编辑任务时的书写方 ...