HDU5536 Chip Factory Trie(01字典树)
来源:互联网 发布:手机兼职打字员软件 编辑:程序博客网 时间:2024/06/05 15:11
题意:
给出
分析:
把每个数字看成一个
然后在Trie树中贪心找到能与
具体匹配的过程中是这样的,首先看树中最高位能否异或得到
能的话就往能的那个方向走,否则往另外一个方向走。
另外删除操作是这样实现的,我们每个节点记录一个
插入时对所有经过节点的
在树上匹配的时候就只走那些
值为正的节点。
#include<bits/stdc++.h>using namespace std;const int maxn = 1010;const int maxnode = 1e5+10;int sz;//总共节点个数int s[maxn], ch[maxnode][2], val[maxnode];void init(){ sz = 1; memset(ch[0], 0, sizeof(ch[0]));}//d=1表示插入,d=-1表示删除void update(int v, int d){ int u = 0; for(int i = 30; i >= 0; i--) { int c = (v >> i) & 1; if(!ch[u][c]) { memset(ch[sz], 0, sizeof(ch[sz])); val[sz] = 0; ch[u][c] = sz++; } u = ch[u][c]; val[u] += d; }}int match(int v){ int ans = 0, u = 0; for(int i = 30; i >= 0; i--) { int c = (v >> i) & 1; if(ch[u][c^1] && val[ch[u][c^1]]) { ans |= (1 << i); u = ch[u][c^1]; } else u = ch[u][c]; } return ans;}int main(){ int n, T; scanf("%d", &T); while(T--) { init(); scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d", &s[i]); update(s[i], 1); } int ans = (s[1] + s[2]) ^ s[3]; for(int i = 1; i <= n; i++) { update(s[i], -1); for(int j = i + 1; j <= n; j++) { update(s[j], -1); int t = match(s[i] + s[j]); ans = max(ans, t); update(s[j], 1); } update(s[i], 1); } printf("%d\n", ans); } return 0;}
动态分配节点的写法:
#include<bits/stdc++.h>using namespace std;const int maxn = 1010;const int N = 2;int s[maxn];struct tree{ int val; tree *nxt[N]; tree() { for(int i = 0; i < N; i++) nxt[i] = NULL; val = 0; }}*root;int a[33];void ch(int x){ memset(a, 0, sizeof(a)); int len = 0; while(x) { a[len++] = x % 2; x /= 2; }}void Insert(int x){ ch(x); int len = 31; tree *p = root; while(len >= 0) { int id = a[len]; if(p -> nxt[id] == NULL) { tree *temp = new tree; p -> nxt[id] = temp; } p = p -> nxt[id]; p -> val++; len--; }}int query(int x){ ch(x); tree *p = root; for(int i = 0; i < 31; i++) a[i] ^= 1; int len = 31; int ans = 0; while(len >= 0) { int id = a[len]; if(p -> nxt[id] == NULL || p -> nxt[id] -> val == 0) id ^= 1; if(id) ans += 1 << len; p = p -> nxt[id]; len--; } return ans ^ x;}void del(int x){ ch(x); int len = 31; tree *p = root; while(len >= 0) { int id = a[len]; p -> nxt[id] -> val--; p = p -> nxt[id]; len--; }}void fre(tree *tmp){ for(int i = 0; i < N; i++) if(tmp -> nxt[i]) fre(tmp -> nxt[i]); delete(tmp);}int main(){ int n, T; scanf("%d", &T); while(T--) { scanf("%d", &n); root = new tree; for(int i = 0; i < n; i++) { scanf("%d", &s[i]); Insert(s[i]); } int ans = 0; for(int i = 0; i < n; i++) { del(s[i]); for(int j = i + 1; j < n; j++) { del(s[j]); ans = max(ans, query(s[i] + s[j])); Insert(s[j]); } Insert(s[i]); } printf("%d\n", ans); fre(root); } return 0;}
阅读全文
0 0
- HDU5536 Chip Factory Trie(01字典树)
- HDU5536 Chip Factory(01字典树)
- HDU5536 Chip Factory(trie树)
- HDU5536 chip factory 【01字典树】
- HDU5536:Chip Factory(字典树)
- hdu5536 Chip Factory (01字典树删除操作)
- HDU5536 Chip Factory(字典树)
- HDU5536 Chip Factory 【字典树】
- HDU5536 Chip Factory(Trie树,二进制)
- hdu5536 Chip Factory(Tire)
- 【HDU5536 2015长春赛区 J】【字典树or暴力】Chip Factory 字典序做法+暴力做法
- hdu5536 Chip Factory (异或最大值)
- hdu5536 Chip Factory
- 01trie树 HDU 5536Chip Factory
- hdu5536 Chip Factory (暴力+优化)
- HDU 5536 Chip Factory(暴力 or 01字典树)
- hdu 5536 Chip Factory(01字典树)
- HDU 5536 Chip Factory(暴力/01字典树)
- LeetCode
- unity麻将出牌后重新布置牌的位置
- JVM GC的核心参数: -XX:Newratio -XX:Newsize -XX:Maxnewsize -XX:Surviorratio
- DRAM、SRAM、SDRAM、DDRSDRAM的区别
- Java语言中关于break,continue和return的区别
- HDU5536 Chip Factory Trie(01字典树)
- 机器学习(7) PASCAL VOC2012数据集
- 死锁产生的4个必要条件,如何检测,解除死锁
- 顺序二叉树的建立、查找、删除、插入、替换、遍历
- java设计模式:代理模式
- 物理地址、虚拟地址(线性地址)、逻辑地址以及MMU的知识
- tarjan初学
- python中的super()
- 哈佛和冯诺依曼,从STM32的const全局变量说起