LightOJ 1269 Consecutive Sum(字典树)
来源:互联网 发布:上瘾网络剧见面会 编辑:程序博客网 时间:2024/04/29 04:47
题意:
给定一个序列,求选定一段区间的亦或和最大值和最小值。
解析:
由于是区间问题,很容易就能想到是要先求前缀异或和。
可以对所有前缀和建立字典树,节点的末尾保存二进制转化成十进制的值。
先查询,再插入。
可以先将所有的的数字转化成二进制字符串,高位在前,低位在后。
最大值很简单,查找时然后尽量往反向走;
最小则需要尽量往正向走。
知道走到尽头时把找到的十进制,异或上当前的值。
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int MAXN = 50005;const int maxnode = MAXN * 33;const int sigma_size = 2;const int INF = (1LL << 31) - 1;struct Trie { int ch[maxnode][sigma_size]; int val[maxnode]; int sz; void clear() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); } Trie() { clear(); } int idx(char c) { return c - '0'; } void insert(char *s, int v) { int u = 0, n = strlen(s); for(int i = 0; i < n; i++) { int c = idx(s[i]); if(!ch[u][c]) { memset(ch[sz], 0, sizeof(ch[sz])); val[u] = 0; ch[u][c] = sz++; } u = ch[u][c]; } val[u] = v; } //^0 equal //^1 opposite int find(char *s, int value, int dir) { int u = 0, n = strlen(s); for(int i = 0; i < n; i++) { int c = idx(s[i]); int v = c ^ dir; if(!ch[u][v]) v ^= 1; u = ch[u][v]; } return val[u] ^ value; }} trie;int n, sum[MAXN], A[MAXN];char bit[33];void trans(char *s, int v) { for(int i = 31; i >= 0; i--) s[i] = ((v >> i) & 1) + '0'; s[32] = '\0'; reverse(s, s+32);}int main() { int T, cas = 1; scanf("%d", &T); while(T--) { scanf("%d", &n); trie.clear(); sum[0] = 0; for(int i = 1; i <= n; i++) { scanf("%d", &A[i]); sum[i] = sum[i-1] ^ A[i]; } trans(bit, 0); trie.insert(bit, 0); int maxv = -INF, minv = INF; int mx, mi; for(int i = 1; i <= n; i++) { trans(bit, sum[i]); mi = trie.find(bit, sum[i], 0); mx = trie.find(bit, sum[i], 1); minv = min(mi, minv); maxv = max(mx, maxv); trie.insert(bit, sum[i]); } printf("Case %d: %d %d\n", cas++ , maxv, minv); } return 0;}
0 0
- LightOJ 1269 Consecutive Sum(字典树)
- LightOJ 1269 - Consecutive Sum(字典树)
- LightOJ 1278Sum of Consecutive Integers数论
- LightOJ 1278 Sum of Consecutive Integers
- 连续子串最大最小异或值 Trie+Xor LightOJ 1269 Consecutive Sum
- LightOJ 1278 - Sum of Consecutive Integers (求一个数能被分解为等差数列的方案数)
- lightOJ 1278 Sum of Consecutive Integers(数论,数学推导)
- LightOJ 1224 DNA Prefix(字典树)
- lightOJ 1244 DNA Prefix (字典树)
- Lightoj 1129【字典树】
- HDU 1977 Consecutive sum II(数学)
- HDU4825 - Xor Sum(Trie 字典树)
- HDU-Xor Sum(01字典树)
- HDU_4825_Xor Sum(字典树)
- LightOJ 1129 - Consistency Checker(字典树)
- LightOJ 1224 - DNA Prefix(字典树)
- 【LightOJ】1189 - Sum of Factorials(思维)
- HDU1868:Consecutive sum
- 周赛一 ACdream 1204 模拟
- uva 639
- Cookie V.S. Session
- 当你输入一个网址的时候,实际会发生什么?
- 【笔试】10、一球从100米高度自由落下,求相关数据
- LightOJ 1269 Consecutive Sum(字典树)
- 剑指offer_面试题14_调整数组顺序使奇数位于偶数前面(函数指针用法)
- 神经网络编程入门
- Majority Element:主元素
- JAVA反射机制实际代码解释
- 连接查询及分组查询强化练习
- 电感绕制方法小结
- Android四大组件之四:BroadcastReceiver 广播接收器
- MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(562,5): error MSB6006: “mt.exe”已退出,代码为 5