题目大意:

  有一个长度为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. 关于 redis、memcache、mongoDB 的对比(转载)

    from:http://yang.u85.us/memcache_redis_mongodb.pdf 从以下几个维度,对 redis.memcache.mongoDB 做了对比.1.性能都比较高,性能 ...

  2. python装饰器入门

    按别人的教程弄的. 要清楚基于类和基于函数的实现的不同之处. #!/usr/bin/env python # -*- coding: utf-8 -*- ''' class entryExit(obj ...

  3. android 入门-关键词介绍

    1.@SuppressLint("HandlerLeak") 2.synchronized详解 http://www.cnblogs.com/GnagWang/archive/20 ...

  4. php获取文件夹下面的文件列表和文件夹列表

    function getDir($dir) { $dirArray[] = NULL; if (false != ($handle = opendir( $dir ))) { $i=0; while ...

  5. ASP.NET MVC 4 WebAPI Simple Sample

    // Controllers.cs namespace Microshaoft.WebApi.Controllers { using Microshaoft.WebApi.Models; using ...

  6. WPF中的依赖项属性

    Form cnblogs 桂素伟 随着WPF的推广,不得不重新拾起WPF来,因为这块的产品越来越多. 只能跟着MSDN来学了,所以想是在这里记录下学习的过程和对知识的理解. 先从最基本的吧,依赖项属性 ...

  7. 在Salesforce中创建Schedule的Job去定时触发对应的Class

    在Salesforce中也存在着Job的概念,当然了我们可以创建Schedule的Job去定时触发对应的Class,来完成我们所需要定时处理的功能,比如:定时同步数据. 具体处理步骤如下所示: 1): ...

  8. Codeforces Round #227 (Div. 2) E. George and Cards set内二分+树状数组

    E. George and Cards   George is a cat, so he loves playing very much. Vitaly put n cards in a row in ...

  9. View(三)

    大家在平时使用View的时候都会发现它是有状态的,比如说有一个按钮,普通状态下是一种效果,但是当手指按下的时候就会变成另外一种效果,这样才会给人产生一种点击了按钮的感觉.当然了,这种效果相信几乎所有的 ...

  10. 一定要学会paxos算法!

    paxos算法 http://blog.csdn.net/dellme99/article/details/14162159