题意:

T组样例,给你n个数。你要找出来这n个数中任意两个数的二进制位中  最低位不同  的位置(假设是k),然后让所有2^k加起来就是结果

什么意思?

例如4 和 2

4的二进制是(100),2的二进制是(010),那么它们二进制位中 最低位不同 的位置  就是1,然后把这个2^1加入最后结果就完了

注意:4和2算一次结果,2和4也要算一次结果

解释个样例:

5
4 0 2 7 0

sum=0

4和0:k=2,sum+=2^2

4和2:k=1,sum+=2^1

4和7:k=0,sum+=2^0

4和0:k=2,sum+=2^2

0和2:k=1,sum+=2^1

0和7:k=0,sum+=2^0

0和0:因为0^0=0,题目上lowbit(0)=0,所以sum+=0

2和7:k=0,sum+=2^0

2和0:k=1,sum+=2^1

7和0:k=0,sum+=2^0

sum=4+2+1+4+2+1+0+1+2+1=18

又因为“4和2算一次结果,2和4也要算一次结果”,所以sum*=2

sum=36

题解:

观察发现对于任意一个数 x 来说,只要前 i-1 位和其它数相等,第i位不相等。那么 ans += cnt * pow(2, i-1);
 cnt 为和它前i-1个前缀都相等的数的个数。 可以利用字典树边插入边更新ans,最后ans*2就是答案。

数组开小了TLE了半天。。。。

代码:

 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cstdlib>
5 #include <algorithm>
6 using namespace std;
7 typedef long long ll;
8 const int maxn=2;
9 const ll mod=998244353;
10 typedef struct Trie* TrieNode;
11 ll v[50005];
12 ll w[31],result;
13 struct Trie
14 {
15 ll val,sum;
16 TrieNode next[2];
17 Trie()
18 {
19 val=0;
20 sum=0;
21 memset(next,NULL,sizeof(next));
22 }
23 };
24
25 void inserts(TrieNode root,ll x,ll y)
26 {
27 TrieNode p = root;
28 for(ll i=0;i<30;++i)
29 {
30 ll temp=(x>>i)&1;
31 if(p->next[temp]==NULL) p->next[temp]=new struct Trie();
32 if(p->next[!temp]!=NULL && p->next[!temp]->sum>0)
33 {
34 ll t=p->next[!temp]->sum;
35 t=(t*(ll)w[i])%mod;
36 result=(result+t)%mod;
37 }
38 p->next[temp]->sum+=y;
39 p=p->next[temp];
40 }
41 p->val=x;
42 }
43 void Del(TrieNode root)
44 {
45 for(ll i=0 ; i<2 ; ++i)
46 {
47 if(root->next[i])Del(root->next[i]);
48 }
49 delete(root);
50 }
51
52 int main()
53 {
54 ll t,n,sum=1;
55 int p=0;
56 w[0]=1;
57 for(int i=1;i<=30;++i)
58 {
59 sum=(sum*2)%mod;
60 w[i]=sum;
61 }
62 scanf("%lld",&t);
63 while(t--)
64 {
65 TrieNode root = new struct Trie();
66 scanf("%lld",&n);
67 //ll ans=0;
68 result=0;
69 for(ll i=1;i<=n;++i)
70 {
71 scanf("%lld",&v[i]);
72 inserts(root,v[i],1);
73 }
74 printf("Case #%d: %lld\n",++p,(result<<1)%mod);
75 Del(root);
76 }
77 return 0;
78 }

ZYB loves Xor I HDU - 5269 字典树的更多相关文章

  1. HDU--5269 ZYB loves Xor I (字典树)

    题目电波: HDU--5269 ZYB loves Xor I 首先我们先解决 ai xor aj 每个数转化为二进制  我们用字典树统计 每个节点 0 和 1 的出现的个数 #include< ...

  2. ZYB loves Xor I(hud5269)

    ZYB loves Xor I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  3. hdu 5269 ZYB loves Xor I

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...

  4. HDU 4825 Xor Sum(01字典树入门题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4825 题意: 给出一些数,然后给出多个询问,每个询问要从之前给出的数中选择异或起来后值最大的数. 思路:将给出的 ...

  5. hdu 4825 Xor Sum(01字典树模版题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 题解:一到01字典树的模版题,01字典树就是就是将一些树用二进制放到一个树上这样可以方便对整体异 ...

  6. HDU 4825 Xor Sum(01字典树)题解

    思路:先把所有数字存进字典树,然后从最高位贪心. 代码: #include<set> #include<map> #include<stack> #include& ...

  7. HDU 4825 Xor Sum (裸字典树+二进制异或)

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

  8. Chip Factory HDU - 5536 字典树(删除节点|增加节点)

    题意: t组样例,对于每一组样例第一行输入一个n,下面在输入n个数 你需要从这n个数里面找出来三个数(设为x,y,z),找出来(x+y)^z(同样也可以(y+z)^1)的最大值 ("^&qu ...

  9. HDU 5687 字典树插入查找删除

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 #include< ...

随机推荐

  1. React & Vue2 Butterfly图编排——让数据更自由地驱动DAG

    一.简介 Butterfly是由阿里云-数字产业产研部孵化出来的的图编辑器引擎,由咱们部门以及其他开发者共同维护开发,具有使用自由.定制性高的优势,已支持集团内外上百张画布,不夸张的说,我觉得可以算的 ...

  2. 【Linux】关于CentOS系统中,文件权限第11位上是一个点的解读

    ------------------------------------------------------------------------------------------------- | ...

  3. Spring Boot Scheduled定时任务特性

    SpringBoot中的Scheduled定时任务是Spring Boot中非常常用的特性,用来执行一些比如日切或者日终对账这种定时任务 下面说说使用时要注意的Scheduled的几个特性 Sched ...

  4. 分布式系统:xxl-job改造spring-cloud

    目录 改造原因 主要改造思路 调度中心 调度中心 执行器侧 总结 修改后的源码仓库地址:GitHub. : 改造原因 原有的xxl-job使用自己实现的http协议进行注册以及调度等,与目前框架中本身 ...

  5. Hadoop 专栏 - MapReduce 入门

    MapReduce的基本思想 先举一个简单的例子: 打个比方我们有三个人斗地主, 要数数牌够不够, 一种最简单的方法可以找一个人数数是不是有54张(传统单机计算); 还可以三个人各分一摞牌数各自的(M ...

  6. CodeMonkey少儿编程第2章 turnTo对象

    目标 了解对象的概念 了解方法与对象的关系 掌握turnTo指令的用法 在开始本章的学习之前,我们先来复习一下上一章的知识点. 在第1章中,我们学会了在这个游戏中最简单的两个指令. step x 其中 ...

  7. Docker 如何动态修改容器端口映射

    Docker端口映射往往是Docker Run命令时通过-p将容器内部端口映射到宿主机的指定端口上,一般来说容器的端口所对应的端口是提前确定需要映射的.但是有些情况下不得不需要临时映射端口,例如Doc ...

  8. 微人事项目-mybatis-持久层

    摘要 最近将微人事这个开源项目进行了复现,这篇文章记录mybaits访问数据库这一块. 其中MyBatis是一个流行的持久层框架,支持自定义SQL.存储过程和高级映射.MyBatis消除了几乎所有的J ...

  9. unity3D进阶

    前言 在之前的例子中,我们都没有用到unity的精髓,例如地形系统.物理系统.粒子系统等,本文记录unity3D的进阶简单应用 前期准备 https://unity.cn/releases/full/ ...

  10. 备份和还原Windows DHCP服务器

    在本教程中,您将学习如何使用DHCP控制台和PowerShell备份和还原Windows DHCP服务器. 您是否曾经经历过DHCP服务器崩溃或故障?在设备开始重新启动之前,一切都会平静. 用户将抱怨 ...