首页 > 其他 > 详细

HDU 4825 Xor Sum(字典树)

时间:2019-11-08 21:05:18      阅读:74      评论:0      收藏:0      [点我收藏+]

嗯...

 

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825

 

这道题更明确的说是一道01字典树,如果ch[u][id^1]有值,那么就向下继续查找/建树,如果没有则向别的方向建树,类似一个贪心的思想。

每次记录一下每个节点的编号及所代表的值。

 

AC代码:

技术分享图片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 
 5 using namespace std;
 6 
 7 int ch[3200005][3];
 8 int cnt;
 9 int val[3200005];
10 
11 inline void build(long long x){
12     int u = 0;
13     for(int i = 31; i >= 0; i--){
14         int id = (x >> i) & 1;
15         if(ch[u][id] == 0) ch[u][id] = ++cnt;
16         u = ch[u][id];
17     }
18     val[u] = x;
19 }
20 
21 inline long long query(long long x){
22     int u = 0;
23     for(int i = 31; i >= 0; i--){
24         int id = (x >> i) & 1;
25         if(ch[u][id^1]) u = ch[u][id^1];
26         else u = ch[u][id];
27     }
28     return val[u];
29 }
30 
31 int main(){
32     int t;
33     scanf("%d", &t);
34     for(int i = 1; i <= t; i++){
35         memset(ch, 0, sizeof(ch));
36         cnt = 0;
37         memset(val, 0, sizeof(val));
38         int n, m;
39         scanf("%d%d", &n, &m);
40         for(int j = 1; j <= n; j++){
41             long long x;
42             scanf("%lld", &x);
43             build(x);
44         }
45         printf("Case #%d:\n", i);
46         for(int k = 1; k <= m; k++){
47             long long x;
48             scanf("%lld", &x);
49             printf("%lld\n", query(x));
50         }
51     }
52     return 0;
53 }
AC代码

 

HDU 4825 Xor Sum(字典树)

原文:https://www.cnblogs.com/New-ljx/p/11822051.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!