从高位向低位构造字典树,因为高位得到的数更大。

AC代码:

#include<cstdio>
using namespace std;
typedef long long LL;
const int maxn=2;
struct node{
	node *next[maxn];
	node(){
		next[0]=next[1]=NULL;
	}
}*root;

LL w[50];
void deal(){
	w[0]=1;
	for(int i=1;i<=36;++i) w[i]=w[i-1]*2;
}
void Init(){
	root = new node();
}
void insert_tree(LL num){
	node *p=root,*q;
	for(int i=32;i>=0;--i){
		LL h=num&w[i];
		int u=0;
		if(h!=0) u=1;
		if(p->next[u]==NULL){
			q=new node();
			p->next[u]=q;
			p=p->next[u];
		}
		else {
			p=p->next[u];
		}
	}
}
LL getAns(LL num,node *u,int lev){
	if(lev<0||u==NULL) return 0;
	LL ans=0;
	int h=num&w[lev];
	if(h!=0) h=1;
	h=1-h; //xor
	if(u->next[h]==NULL) ans+=(1-h)*w[lev]+getAns(num,u->next[1-h],lev-1);
	else ans+=h*w[lev]+getAns(num,u->next[h],lev+-1);
	return ans;
}
void free_tree(node *u){ //释放内存
	if(u==NULL) return;
	free_tree(u->next[0]);
	free_tree(u->next[1]);
	delete u;
}
int main(){
	deal();
	int T,n,m,kase=1;
	LL x;
	scanf("%d",&T);
	while(T--){
		Init();
		scanf("%d%d",&n,&m);
		for(int i=0;i<n;++i) {
			scanf("%lld",&x);
			insert_tree(x);
		}
		printf("Case #%d:\n",kase++);
		LL S;
		for(int i=0;i<m;++i){
			scanf("%lld",&S);
			printf("%lld\n",getAns(S,root,32));
		}
		free_tree(root);
	}
	return 0;
}

如有不当之处欢迎指出!

hdu4825 01字典树+贪心的更多相关文章

  1. HDU 4825 Xor Sum(经典01字典树+贪心)

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

  2. codeforces 842 D. Vitya and Strange Lesson(01字典树+思维+贪心)

    题目链接:http://codeforces.com/contest/842/problem/D 题解:像这种求一段异或什么的都可以考虑用字典树而且mex显然可以利用贪心+01字典树,和线段树差不多就 ...

  3. hdu-4825(01字典树)

    题意:中文题意 解题思路:01字典树板子题 代码: #include<iostream> #include<algorithm> #include<cstdio> ...

  4. cf842D 01字典树|线段树 模板见hdu4825

    一般异或问题都可以转换成字典树的问题,,我一开始的想法有点小问题,改一下就好了 下面的代码是逆向建树的,数据量大就不行 /*3 01字典树 根据异或性质,a1!=a2 ==> a1^x1^..^ ...

  5. HDU4825(01字典树)

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

  6. [Hdu4825]Xor Sum(01字典树)

    Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问 ...

  7. [HDU-4825] Xor-Sum (01字典树)

    Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeu ...

  8. 数据结构&字符串:01字典树

    利用01字典树查询最大异或值 01字典树的是只含有0和1两种字符的字典树,在使用它的时候,把若干数字转成二进制后插入其中 在查询树中的哪个数字和给定数字有最大异或值的时候,从根开始贪心查询就ok了 H ...

  9. NEUOJ711 异星工厂 字典树+贪心

    题意:你可以收集两个不相交区间的权值,区间权值是区间异或,问这两个权值和最大是多少 分析:很多有关异或求最大的题都是利用01字典树进行贪心,做这个题的时候我都忘了...最后是看别人代码的时候才想起来这 ...

随机推荐

  1. JS与ajax遍历list

    示例: <script> <c:forEach var="yanan" items="${yananList}">            ...

  2. java去重(1通过迭代器,2直接赋值)

    1.List<Integer> list=new ArrayList<Integer>();  //有值 List<Integer> listTemp= new A ...

  3. zabbix图形乱码

    毕竟是中文为主,特别是有些香项目最好以中文命名,容易区分,也方便识别 环境: centos7.3安装zabbix3.2 问题: 图文乱码问题 原理上只要找到对应的字符集,在修改配置文件 windows ...

  4. 时间转换与星期推算(Matlab版)

    1 概述 最近在学习GPS解算算法时需要在GPS时(GPS周和周内秒)和公历日期之间进行转换,于是就整理了一些时间转换的小程序. 本文介绍了GPS时.公历.儒略日(JD).简化儒略日(MJD)之间的转 ...

  5. fopen fclose feof fgets fetl

    fopen :Open file, or obtain information about open files 例如 fid = fopen(filename, permission)%许可包括: ...

  6. Databricks缓存提升Spark性能--为什么NVMe固态硬盘能够提升10倍缓存性能(原创)

    我们兴奋的宣布Databricks缓存的通用可用性,作为统一分析平台一部分的 Databricks 运行时特性,它可以将Spark工作负载的扫描速度提升10倍,并且这种改变无需任何代码修改. 1.在本 ...

  7. Docker之镜像

    镜像(Images) 镜像是Docker的三大核心之一,类似于虚拟机,作用和虚拟机是一样的,唯独是组成部分会有些区别.简单的说如果我们想启动一个容器就必须要有镜像.docker运行容器前需要本地存在对 ...

  8. ABAP 程序中退出操作

    CHECK. 1)CHECK 后面要跟一个表达式,当表达式值为假(false)时,CHECK发生作用,退出循环(LOOP)或处理程序(Processing Block). 2)如果CHECK出现在循环 ...

  9. 洛谷 [P2486] 染色

    树剖+线段树维护连续相同区间个数 注意什么时候长度要减一 #include <iostream> #include <cstdio> #include <cstdlib& ...

  10. 洛谷 [P3033] 牛的障碍

    利用二分图匹配求最大独立集 本题的边一定平行于坐标轴,且同向的线段一定不重合,这是经典的二分图建图方法,本题要求的是最大不重合的线段数,那就是求二分图的最大独立集,最大独立集=总点数-最大匹配数. 本 ...