题目大意:

  有一个长度为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. 二、JavaScript语言--JS基础--JavaScript进阶篇--JavaScript内置对象

    1.什么事对象 JavaScript 中的所有事物都是对象,如:字符串.数值.数组.函数等,每个对象带有属性和方法. 对象的属性:反映该对象某些特定的性质的,如:字符串的长度.图像的长宽等: 对象的方 ...

  2. php文件上传进度条例子

    <?php session_start(); ?> <!DOCTYPE html> <html lang="zh-CN"> <head&g ...

  3. MVC缓存02,使用数据层缓存,添加或修改时让缓存失效

    在"MVC缓存01,使用控制器缓存或数据层缓存"中,在数据层中可以设置缓存的有效时间.但这个还不够"智能",常常希望在编辑或创建的时候使缓存失效,加载新的数据. ...

  4. VS对路径的访问被拒绝

    问题:权限问题. 1.检查自己电脑账户.是否是Administrator.如果没有启用.在[我的电脑]——[管理]——[本地用户和组]——[用户]——[Administrator]——[属性启用] 2 ...

  5. Delphi线程简介---Create及其参数、Resume、Suspend

    TThread在Classes单元里的声明如下 type TThread = class private FHandle: THandle; FThreadID: THandle; FTerminat ...

  6. OCJP(1Z0-851) 模拟题分析(八)over

    Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有 ...

  7. OCJP(1Z0-851) 模拟题分析(二)over

    Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有 ...

  8. hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. HDU4008 Parent and son(树形DP LCA)

    先记录以1为根时每个节点子树儿子节点的最大与次小值,询问x, y时,先判断x在不在y的子树范围内,若不在,结果为y的儿子结点,后继的最小值. 若x在y的子树范围内,若y儿子最小值是x的前驱,从次小值与 ...

  10. git 创建本地分支,然后推送到服务器上

    git checkout -b crm-2.repair-callback.phoneSet git checkout -b crm-2.repair-callback.RepairHis git p ...