Cow XOR
Adrian Vladu -- 2005

Farmer John is stuck with another problem while feeding his cows.
All of his N (1 ≤ N ≤ 100,000) cows (numbered 1..N) are
lined up in front of the barn, sorted by their rank in their social
hierarchy. Cow #1 has the highest rank; cow #N has the least rank.
Every cow had additionally been assigned a non-unique integer number
in the range 0..(221 - 1).

Help FJ choose which cows will be fed first by selecting a
sequence of consecutive cows in the line such that the bitwise "xor"
between their assigned numbers has the maximum value. If there are
several such sequences, choose the sequence for which its last cow
has the highest rank. If there still is a tie, choose the shortest
sequence.

TIME LIMIT: 0.5 sec

PROGRAM NAME: cowxor

INPUT FORMAT

  • Line 1: A single integer N
  • Lines 2..N+1: N integers ranging from 0 to 221 - 1, representing the cows' assigned
    numbers. Line j describes cow of social hierarchy j-1.

SAMPLE INPUT (file cowxor.in)

5
1
0
5
4
2

INPUT DETAILS:

There are 5 cows. Cow #1 had been assigned with 1; cow #2 with 0; cow #3 with 5; cow #4 with 4; cow #5 with 2.

OUTPUT FORMAT

  • Line 1: Three space-separated integers, respectively: the maximum requested value, the position where the sequence begins, the position where the sequence ends.

SAMPLE OUTPUT (file cowxor.out)

6 4 5

OUTPUT DETAILS:

4 xor 2 = 6 (001) xor (010) = (011)


题目大意:找到一个连续的区间,使各数异或之后的结果最大。

算法:用a[i]表示a[1...i]的异或结果,则任一区间的异或结果s[i...j]=a[i-1] xor a[j].

现在问题变成了,对于每一个j,我们需要找到一个i≤j,使得a[i-1] xor a[j]最大。

这时候我们可以用trie树实现这样的一个查找。

我们将a中的元素先转化成二进制字符串再插入到trie中,因此trie树中每一个节点对应一条0和一条1的边。

此时a[j]的二进制字符串对应一条从trie树的根节点走到叶子节点的路径,我们在找符合条件的a[i-1]的过程就是从根节点出发,在某一深度上尽量沿着与a[j]相反的边来走,就是说,假设a[j]的某一位是1,那a[i-1]应尽量取0(就是走0的边),不存在此边的时候再选另一边。

注意这里的数组不能开到221,usaco会MLE,实际上完全不用这么大,数据虽然很大,但是并不是每个结点都有0,1两条边。

Executing...
   Test 1: TEST OK [0.008 secs, 13748 KB]
   Test 2: TEST OK [0.005 secs, 13748 KB]
   Test 3: TEST OK [0.005 secs, 13748 KB]
   Test 4: TEST OK [0.005 secs, 13748 KB]
   Test 5: TEST OK [0.049 secs, 13748 KB]
   Test 6: TEST OK [0.124 secs, 13748 KB]
   Test 7: TEST OK [0.227 secs, 13748 KB]
   Test 8: TEST OK [0.213 secs, 13748 KB]
   Test 9: TEST OK [0.227 secs, 13748 KB]
   Test 10: TEST OK [0.230 secs, 13748 KB]
   Test 11: TEST OK [0.308 secs, 13748 KB]
   Test 12: TEST OK [0.289 secs, 13748 KB]
   Test 13: TEST OK [0.227 secs, 13748 KB]
   Test 14: TEST OK [0.221 secs, 13748 KB]
   Test 15: TEST OK [0.343 secs, 13748 KB]
   Test 16: TEST OK [0.329 secs, 13748 KB]
   Test 17: TEST OK [0.348 secs, 13748 KB]
   Test 18: TEST OK [0.221 secs, 13748 KB]
   Test 19: TEST OK [0.046 secs, 13748 KB]
   Test 20: TEST OK [0.008 secs, 13748 KB]

All tests OK.

 #include <iostream>
#include <cstring>
#include <vector>
#include <stdio.h>
#include <string>
using namespace std;
#define BIT_AT(x,n) ((x & (1<<n))>>n) const int maxnode = ;
const int sigma_size = ; // 字母表为全体小写字母的Trie
struct Trie
{
int ch[maxnode][sigma_size]; // ch[i][j]表示i节点通过字母为j的边的连接下一节点的编号,没有即为0
int val[maxnode];
int sz; // 结点总数
void clear()
{
sz = ; // 初始时只有一个根结点
memset(ch[], , sizeof(ch[]));
}
int idx(char c)
{
return c - ''; // 字符c的编号
} // 插入字符串s,附加信息为v。注意v必须非0,因为0代表“本结点不是单词结点”
// 附加信息为i,即第几个单词
void insert(const char *s, int v)
{
int u = , n = strlen(s);
for(int i = ; i < n; i++)
{
int c = idx(s[i]);
if(!ch[u][c]) // 结点不存在
{
memset(ch[sz], , sizeof(ch[sz]));
val[sz] = ; // 中间结点的附加信息为0,因此clear时不用memset()
ch[u][c] = sz++; // 新建结点
}
u = ch[u][c]; // 往下走
}
val[u] = v; // 字符串的最后一个字符的附加信息为v
} int find_min(int x,int &min_i)
{
int Min=;
int u = ;
for(int i = ; i <= ; i++)
{
int tmp=BIT_AT(x,-i);
int c = (tmp^);
if(!ch[u][c])
c=tmp;
u = ch[u][c];
Min=Min*+c;
}
min_i=val[u];
return Min;
}
};
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
Trie trie;
// 将某个数的二进制转换成22位字符串
string toString(int x)
{
string str;
for(int i=;i>=;i--)
{
str.append(BIT_AT(x,i)==?"":"");
}
return str;
} int a[]={};
int b[]={}; int main()
{
freopen("cowxor.in","r",stdin);
freopen("cowxor.out","w",stdout);
int n;
cin>>n;
trie.clear();
// 初始插入0
trie.insert(toString().c_str(),); int ans=-,pos1=-,pos2=-;
for(int i=;i<=n;i++)
{
int t;
scanf("%d",&t);
b[i]=t;
a[i]=a[i-]^t;
int min_i;
int tmp=trie.find_min(a[i],min_i)^a[i];
if(ans<tmp/* || (ans==tmp && b[pos2]<t) || (ans==tmp && b[pos2]==t && pos2-pos1>i-min_i-1)*/)
{
ans=tmp;
pos1=min_i+;
pos2=i;
}
trie.insert(toString(a[i]).c_str(),i);
}
printf("%d %d %d\n",ans,pos1,pos2); return ;
}

usaco6.1-Cow XOR:trie树的更多相关文章

  1. Xor - Trie树

    题目描述 求一棵带边权的树的一条最大 Xor 路径的值.这里的"路径"不一定从根到叶子结点,中间一段路径只要满足条件也可以. 输入格式 第一行,一个整数 N ,表示一颗树有 N 个 ...

  2. [USACO]6.1.3 cow xor(二进制+Trie)

    题意:给你一个序列(n<=100000),求出一个连续的子序列[i,j]使得ai xor ai+1 xor…… xor aj最大,求出这个最大值(其中每个数<=2^21) 分析:题目和求一 ...

  3. 51nod 1295 XOR key (可持久化Trie树)

    1295 XOR key  题目来源: HackerRank 基准时间限制:1.5 秒 空间限制:262144 KB 分值: 160 难度:6级算法题   给出一个长度为N的正整数数组A,再给出Q个查 ...

  4. 51nod 1295 XOR key | 可持久化Trie树

    51nod 1295 XOR key 这也是很久以前就想做的一道板子题了--学了一点可持久化之后我终于会做这道题了! 给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X ...

  5. HDU 5269 ZYB loves Xor I Trie树

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5269 bc:http://bestcoder.hdu.edu.cn/contests/con ...

  6. HDU 4825 Xor Sum (trie树处理异或)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total S ...

  7. CodeForces979D:Kuro and GCD and XOR and SUM(Trie树&指针&Xor)

    Kuro is currently playing an educational game about numbers. The game focuses on the greatest common ...

  8. Poj 3764 The xor-longest Path(Trie树+xor+贪心)

    The xor-longest Path Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6455 Accepted: 1392 ...

  9. The XOR Largest Pair (trie树)

    题目描述 在给定的 NN 个整数 A_1,A_2,--,A_NA1​,A2​,--,AN​ 中选出两个进行xor运算,得到的结果最大是多少?xor表示二进制的异或(^)运算符号. 输入格式 第一行输入 ...

随机推荐

  1. DVP

    债券结算方式是指在债券结算业务中,债券的所有权转移或权利质押与相应结算款项的交收这两者执行过程中的不同制约形式.中央债券簿记系统中所设计的结算方式有:纯券过户.见券付款.见款付券.券款对付(DVP)四 ...

  2. 创建第一个freemarker

    1.创建java项目TestFreeMarker 2.导入包freemarker.jar,添加依赖 3.在根目录下创建一个文件夹templates 4.在文件夹templates下创建文件a.ftl ...

  3. ApacheBench~网站性能测试工具

    对于网站性能测试来说,一般我们会使用loadrunner来实现,而它过于庞大,使我们感到有些不爽,而今天介绍的ApacheBench工具,它小而精,使用简单,效果直观,可以说,是比lr更好用的性能测试 ...

  4. [置顶] ARM指令集和常用寄存器

    1) ARM指令集 32位的 ARM指令和 16位 的Thumb指令 1,寄存器寻址 MOV R1, R2  //将寄存器R2的值传给寄存器R1 2,立即寻址 MOV R0, #0XFF00 //数据 ...

  5. 颜色矩阵 滤镜 ColorMatrix

    颜色矩阵原理 色彩的三要素 1.色相.色相通俗的说就是"颜色",色相的改变就是颜色的改变,色相的调节伴随着红橙黄绿蓝紫的变化. 2.亮度.明度通俗的说就是"光照度&quo ...

  6. C# List 泛型用法

    List 类是 ArrayList 类的泛型等效类,某些情况下,用它比用数组和 ArrayList 都方便. 我们假设有一组数据,其中每一项数据都是一个结构. public struct Item{  ...

  7. log4net根据日志类型写入到不同的文件中

    <?xml version="1.0"?> <configuration> <configSections> <!--log4net配置安 ...

  8. jQuery下的显示和隐藏

    因为太久没更新了,所以来放一点没意思的内容. 做的是jQuery框架的隐藏和显示,HTML如下: <ul> <li>1</li> <li>2</l ...

  9. (转)VS无法启动调试:“生成下面的模块时,启用了优化或没有调试信息“

    中调试项目遇到错误提示,Visual Studio 2010(或VS2008或VS2005)启动调试的时候,弹出提示信息: 生成下面的模块时,启用了优化或没有调试信息: C:\WINDOWS\Micr ...

  10. Xcode简易基础篇,以新手角度去操作

    声明:此Newlife XCode非Mac的XCode,避免误会. 日常用的Newlife X组件的相关资源,不限于XCode,只是以XCode组件为主: 1.QQ群:1600800 2.博客 : h ...