题目链接:

hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5269

bc:http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=603&pid=1002

题解:

  (以下有提到位数的都是指二进制表示)

  对于xor值为1的两个数,他们的最低位(二进制表示)必然不同,所以我们把n个数按最低位数不同分为两堆,这两堆个数的乘积就是xor的值等于1的贡献。同理,我们可以递归处理出xor值等于2,4,8,16...2^30的贡献值,然后把它们加起来。

  一种做法是类似快速排序先按最低位数排序,0的在左边,1的在右边,算完2^0的贡献之后,再递归算全0的那块,全1的那块中2^1的贡献,依次类推。不过这种做法的缺陷是最坏情况下时间复杂度会变为n^2;

  一种高效的做法是用一颗trie树来维护,把每个数从最低位开始按每一位的01取值存到trie树上,这样某一位为零的都会在左子树上,为1的都会在右子树上。这样离线处理好就不用我们每一次递归的时候去维护了.

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; const int maxn=+;
const int mod=;
typedef long long LL; struct Trie{
int ch[maxn*][],tot;
int val[maxn*];
void init(){
val[]=;
memset(val,,sizeof(val));
memset(ch[],,sizeof(ch[]));
tot=;
}
void insert(int x){
int p=;
for(int i=;i<;i++){
int tmp;
if((<<i)&x) tmp=;
else tmp=;
if(!ch[p][tmp]){
memset(ch[tot],,sizeof(ch[tot]));
ch[p][tmp]=tot++;
}
p=ch[p][tmp];
val[p]++;
}
}
void query(int cur,int h,LL &ans){
int lef=ch[cur][],rig=ch[cur][];
LL tmp=(LL)val[lef]*val[rig]%mod*(<<h)%mod;
// printf("tmp:%d\n",tmp);
ans+=tmp;
ans%=mod;
if(lef) query(lef,h+,ans);
if(rig) query(rig,h+,ans);
}
}trie; int n; void init(){
trie.init();
} int main(){
int tc,kase=;
scanf("%d",&tc);
while(tc--){
init();
scanf("%d",&n);
for(int i=;i<n;i++){
int x;
scanf("%d",&x);
trie.insert(x);
}
// for(int i=0;i<22;i++) printf("val:%d\n",trie.val[i]);
LL ans=;
trie.query(,,ans);
printf("Case #%d: %lld\n",++kase,ans*%mod);
}
return ;
}

HDU 5269 ZYB loves Xor I Trie树的更多相关文章

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5269 思路分析:当lowbit(AxorB)=2p 时,表示A与B的二进制表示的0-p-1位相等,第p ...

  2. hdu 5269 ZYB loves Xor I

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

  3. hdu 5269 ZYB loves Xor I 分治 || Trie

    题目大意: 长度为\(n\)的数组A.求对于所有数对\((i,j)(i \in [1,n],j \in [1,n])\),\(lowbit(A_i xor A_j)\)之和.答案对998244353取 ...

  4. hdu 5269 ZYB loves Xor I &amp;&amp; BestCoder Round #44

    题意: ZYB喜欢研究Xor,如今他得到了一个长度为n的数组A. 于是他想知道:对于全部数对(i,j)(i∈[1,n],j∈[1,n]).lowbit(AixorAj)之和为多少.因为答案可能过大,你 ...

  5. HDU 5269 ZYB loves Xor I (二分法)

    题意: 给出一个序列,对每两个数求异或结果后取最低位的1出来作为一个数,然后求这些数字的和.比如:{a,b,c},结果是lowbit(a^b)+lowbit(a^c)+lowbit(b^a)+lowb ...

  6. 【HDU】5269 ZYB loves Xor I

    [算法]trie [题解] 为了让数据有序,求lowbit无法直接排序,从而考虑倒过来排序,然后数据就会呈现出明显的规律: 法一:将数字倒着贴在字典树上,则容易发现两数的lowbit就是它们岔道结点的 ...

  7. bestcoder r44 p3 hdu 5270 ZYB loves Xor II

    这是昨晚队友跟我说的题,不知道当时是什么玄幻的事件发生了,,我看成了两两相乘的XOR 纠结了好长时间间 不知道该怎么办 今天早上看了下这道题,发现是两两相加的XOR  然后就想了想昨晚的思路 发现可做 ...

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

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

  9. hdu 5274 Dylans loves tree(LCA + 线段树)

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

随机推荐

  1. iOS日历显示农历信息

    第一次接触到日历的开发,表示需要学习的东西还有很多呢! 关于日历的开发,如果不进行相关设置的话,默认是没有农历的,需要我们进行设置. 核心Demo如下: monthArr = [NSArray arr ...

  2. 转 Linux会话浅析(写得极好,表述清楚语言不硬)

    说起会话,我们经常登录到linux系统,执行各种各样的程序,这都牵涉到会话.但是,一般情况下我们又很少会去关注到会话的存在,很少会去了解它的来龙去脉.本文就对linux会话相关的信息做一些整理,看看隐 ...

  3. 课时54.audio标签(掌握)

    1.什么是audio标签? 播放音频 格式: <audio src=""> </audio> 也是由于同样的适配问题,所以出现了第二种格式 <audi ...

  4. Redis之配置文件redis.conf

    解读下 redis.conf 配置文件中常用的配置项,为不显得过于臃长,已选择性删除原配置文件中部分注释. # Redis must be started with the file path as ...

  5. C语言中const有什么用途

    自己上网查的资料. 可以定义const常量,具有不可变性.例如:const int Max=100; Max++会产生错误; 便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患.例如: v ...

  6. 20155226 实验三 敏捷开发与XP实践 实验报告

    20155226 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...

  7. 2016-2017-2 20155302 实验二《Java面向对象程序设计》实验报告

    2016-2017-2 20155302 实验二<Java面向对象程序设计>实验报告 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握U ...

  8. 百度地图Map属性和方法

    map的L属性:TANGRAM__1 map的F属性:[object Object] map的xa属性:[object HTMLDivElement] map的width属性:1340 map的hei ...

  9. centos7下将java -jar命令运行一个项目做成systemd服务

    有些时候运行一个java项目在linux下通过一条简单的java命令即可,如: #nohup java -jar jenkins.war & ###这里为后台运行jenkins 在此背景下,j ...

  10. oss上传文件0字节

    最近使用oss上传文件,不同项目中使用的版本也不同,之前的都能正常上传,最近因需要添加ObjectMetaData属性,扩展了一个方法,发现上传的文件始终是0字节的,最终跟源码发现conntentLe ...