Codeforces 282E(Sausage Maximization)
来源:互联网 发布:郑州linux运维招聘 编辑:程序博客网 时间:2024/05/19 00:14
题意:给出一段序列,找出一个连续的前缀,一个连续的后缀,使这些数异或出来的值最大。除了前缀或后缀为空以外,前缀和后缀必须包含第一个和最后一个元素。
就是序列a1,a2,a3...an,找出前缀[0,l],后缀[r, n + 1],使这些数异或起来最大,其中r > l,a0和an+1假设它为0,就是说[0,0]表示前缀为空,[n+1,n+1]表示为后缀为空。
思路:这题有点神,没做过类似的题感觉有点难想出来,看了别人的解题报告之后发现,这题真的很神,忍不住把它写上了博客。首先可以将问题转化一下,可以发现序列的所有前缀和后缀都可以在O(n)的时间内求出来,然后问题就转化为了找出两个数异或起来最大,并且它们不能相交,异或起来最大就是尽量让这两个数的各个二进制位异或起来为1;接着字典树就派上用场了,首先我们枚举每一个后缀,在枚举的同时,将与其不相交的前缀插入到字典树中,并对于每一个后缀,我们可以求出和这个异或起来最大且不相交的前缀,至于求这个前缀,我们可以利用点贪心的思想,就是从高位开始枚举,就是越高位越能异或得到1就越好,这样我们就能求出这个前缀了。
#include <cstdio>#include <iostream>#include <algorithm>using namespace std;typedef long long LL;const int N = 100010;const int MAXBITS = 50;LL num[N];struct Node { int key; Node *child[2]; Node(){ child[0] = child[1] = NULL; key = 0; }} *root;struct Trie { void insert(LL val) { Node *s = root; for(int i = MAXBITS; i >= 0; i--) { int dir = ((1LL << i) & val) > 0; if(s->child[dir] == NULL) { Node *p = new Node; p->key = dir; s->child[dir] = p; } s = s->child[dir]; } } LL query(LL val) { LL res = 0; Node *s = root; for(int i = MAXBITS; i >= 0; i--) { int dir = ((1LL << i) & val) > 0; if(s->child[!dir] != NULL) s = s->child[!dir]; else s = s->child[dir]; res += (1LL << i) * s->key; } return res; }} tree;int main() { int n, i; cin >> n; LL prefix = 0, suffix = 0, ans = 0; for(i = 1; i <= n; i++) { scanf("%I64d", &num[i]); suffix ^= num[i]; } for(i = 1; i <= n + 1; i++) { tree.insert(prefix); LL x = tree.query(suffix); ans = max(ans, (x ^ suffix)); prefix ^= num[i], suffix ^= num[i]; } cout << ans << endl; return 0;}
- Codeforces 282E(Sausage Maximization)
- CodeForces 282E Sausage Maximization
- Sausage Maximization - CodeForces 282 E Trie树
- Codeforces 282E Sausage Maximization(字典树)
- Codeforces 282E Sausage Maximization (Trie)
- CodeForces Round #173 (282E) - Sausage Maximization 字典树
- Codeforces 282E Sausage Maximization Trie字典树
- Codeforces 282E Sausage Maximization【字典树+贪心】
- Codeforces 282E. Sausage Maximization【trie树(非指针版)】
- 【Codeforces 282E】Sausage Maximization 中文题意&题解&代码(C++)
- CF282 E Sausage Maximization[trie树]
- Codeforces Round #173 (Div. 2) E. Sausage Maximization —— Trie树 + 前缀和
- codeforces 282e
- Sausage API
- codeforces 163E e-Government
- 【Codeforces 163E】E-Government
- Codeforces 78E Evacuation
- 【dp】codeforces 83E
- 不修改projects的情况下使用reveal
- 一种H.264高清视频的无参考视频质量评价算法(基于QP和跳过宏块数)
- 匹配 Email 地址的正则表达式
- ubuntu12.04安装ssh和telnet服务器
- Union与Struct的区别
- Codeforces 282E(Sausage Maximization)
- Linux中fork()函数详解
- android listView 到上下边界 蓝色或黄色阴影去除方法
- poj 2387 Til the Cows Come Home
- 用GTD方法管理邮件收件箱
- SPOJ 1811 LCS(后缀自动机)
- gflags调试访问越界
- 分布式选举算法
- 仿酷狗音乐播放器