题目大意:

  有一个长度为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. PortSentry是入侵检测工具中配置最简单、效果最直接的工具之一

    https://sourceforge.net/projects/sentrytools/ [root@localhost ~]# tar -xzvf portsentry-1.2.tar.gz [r ...

  2. 使用Timer和ScheduledThreadPoolExecutor执行定时任务

    Java使用Timer和ScheduledThreadPoolExecutor执行定时任务 定时任务是在指定时间执行程序,或周期性执行计划任务.Java中实现定时任务的方法有很多,主要JDK自带的一些 ...

  3. 【20140113-2】MyEclipse生成javadoc时出错:编码GBK的不可映射字符

    今天生成java doc文档时,出现了如下所示的错误: 正在装入软件包 com.wisdom.test 的源文件...F:\workspace\StringUtils\src\com\wisdom\t ...

  4. [LeetCode] Ugly Number II

    Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...

  5. AOJ789 买酒

    买酒 Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MBTotal Submission: 70   Submis ...

  6. .NET Framework 4 与 .NET Framework 4 Client Profile

    今天碰到的一个问题和Client Profile相关的.问题是这样的:一个WPF工程,需要引用另外几个.NET的assembly, 在WPF工程中添加了对这几个assembly的引用,并在程序中可以添 ...

  7. T-SQL Transact-SQL 编程

    T-SQL语句用于管理SQL Server数据库引擎实例,创建和管理数据库对象,以及查询.插入.修改和删除数据. Ø 变量 . 局部变量(Local Variable) 局部变量是用户可以自定义的变量 ...

  8. EditText监听键盘输入

    第一步,先在布局中为EditText设置属性 <EditText android:singleLine="true" android:imeOptions="act ...

  9. bat

    1.输出系统时间,利用系统时间做文件名 @echo offset filename=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%ti ...

  10. Loadrunner中参数化实战(6)-Random+Each occurrence

    参数化数据30条: 脚本如下,演示登录,投资,退出操作是,打印手机号: 首先验证Vugen中迭代: Random+Each occurrence 设置迭代4次Action 结果如下: