Xor Sum (01字典树)基础的字典树题目
来源:互联网 发布:淘宝关键词是什么 编辑:程序博客网 时间:2024/05/22 00:44
初学字典树的可以拿这道题练练手。
题目链接:传送门
题目大意:给你n个数,有m次询问,每次给个数,问:这个数与n个数中的哪个数的异或值最大,输出它。
给大家两种写法;
1。数组的写法:
#include <cstdio>#include <cstring>#include <iostream>using namespace std;//typedef __int64 ll;typedef long long ll;const int M = 55;const int N = M*1e5;struct Node{ ll val; int l; int r; void clear() { l = r = -1; }} node[N];int p;ll a, t[M];void insert (int& root, int d, ll u){ if (root == -1) { root = p++; node[root].clear(); } if (d == -1) { node[root].val = u; return; } if (u & t[d]) insert(node[root].r, d - 1, u); else insert(node[root].l, d - 1, u);}void query(int root, int d, ll u){ if (d == -1) { printf("%lld\n", node[root].val); return; } if (((u & t[d]) && node[root].l != -1) || node[root].r == -1) query(node[root].l, d - 1, u); else query(node[root].r, d - 1, u);}int main (){ int cas, n, m; scanf("%d", &cas); t[0] = 1; for (int i = 1; i < 55; i++) t[i] = t[i-1] * 2; for (int i = 1; i <= cas; i++) { p = 0; int root = -1; scanf("%d%d", &n, &m); for (int j = 0; j < n; j++) { scanf("%lld", &a); insert(root, 50, a); } printf("Case #%d:\n", i); for (int j = 0; j < m; j++) { scanf("%lld", &a); query(root, 50, a); } } return 0;}
2。指针的写法:
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;typedef long long ll;ll a,wei[56];struct node{ node *left,*right; bool l,r; ll data; void clean() { l=0; data=0; r=0; }};void build(node *head,int f){ if(f==-1) { head->data=a; return ; } if(a&wei[f]) { if(head->r==0) { head->r=1; head->right=new node; head->right->clean(); } build(head->right,f-1); } else { if(head->l==0) { head->l=1; head->left=new node; head->left->clean(); } build(head->left,f-1); }}void query(node *head,ll f){ if(f==-1) { printf("%lld\n",head->data); return ; } //printf(" fjhd\n"); if(((a&wei[f])&&head->l==1)||head->r==0) query(head->left,f-1); else query(head->right,f-1);}int main(){ int t,tt=1; wei[0]=1; for(int i=1; i<=55; i++) wei[i]=wei[i-1]*2; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); node *head=new node; head->clean(); for(int i=0; i<n; i++) { scanf("%lld",&a); build(head,50); } printf("Case #%d:\n",tt++); for(int i=0; i<m; i++) { scanf("%lld",&a); query(head,50); } } return 0;}
阅读全文
0 0
- Xor Sum (01字典树)基础的字典树题目
- HDU-Xor Sum(01字典树)
- 【01字典树】HDU 4825 Xor Sum
- HDU 4825 Xor Sum 01字典树
- HDU 4825 Xor Sum (01字典树)
- HDU 4825 Xor Sum(01字典树)
- HDU 4825 Xor Sum 【01字典树】
- hdu Xor Sum 4825 01字典树
- HDU4825 - Xor Sum(Trie 字典树)
- HDU4825 Xor Sum 字典树
- hdu4825 Xor Sum 【字典树】
- HDU 4825 Xor Sum (01字典树)
- HDU 4825 Xor Sum(经典01字典树)
- HDU 4825 Xor Sum(01字典树+异或)
- HDU 4825 Xor Sum(01字典树)
- hdu 4825 Xor Sum(01字典树)
- HDU 4825:Xor Sum(01字典树+贪心)
- 字典树-百度之星-Xor Sum
- 【C++】数数:用数字来数数Count and Say
- 安装VMware以及在虚拟机上安装CentOS
- 【boolan c++】 带有指针成员的class
- 《汇编语言》(王爽)检测点2.2
- Bloom Filter原理介绍
- Xor Sum (01字典树)基础的字典树题目
- Wannafly模拟赛5 D Aria(全排列)
- Maximal GCD CodeForces
- hdu 4857
- 高级面试题-String-StringBuilder-StringBuffer 的区别
- 2017CCPC秦皇岛 M:Safest Buildings
- 2017.11.5总结
- 习题6.1
- 类的声明与定义