一道trie树的好题

首先我们发现后手对x的操作就是将x左移一位,溢出位在末尾补全

那么我们也可以理解为现将初值进行该操作,再将前i个元素异或和进行操作,与上等同。

那么我们等于转化了问题:

    我们求出m+1个数(前i个元素进行操作,再异或后面元素),并从1-2^n中找到一个数使最小值最大

(当然数已经进行溢出操作了)。

于是我们联想到trie树.........

    1.建出m+1个数的trie树

    2.对于从高位到低位的搜索,

      若是当前只有1或0有节点,我们都有办法使结果当前位是1,那么或上这个位的1

      若是都有,因为当前是高位,后手当然会把改为搞成0

      若是无节点统计答案,返回

时间复杂度(nm),注意数组开为节点×50

 1 #include<iostream>
2 #include<cstdio>
3 #include<string>
4 #include<algorithm>
5 #include<cmath>
6 #include<vector>
7 #include<map>
8 #include<cstring>
9 #define int long long
10 #define MAXN 101000
11 using namespace std;
12 int T[MAXN*50][3];int deep[MAXN*50];
13 int tot=1;
14 int summ,base;
15 int bin[MAXN];
16 int n,m,a[MAXN];int pre[MAXN];
17 int read()
18 {
19 int x=0;char c=getchar();
20 while(c<'0'||c>'9')c=getchar();
21 while(c>='0'&&c<='9')
22 {
23 x=(x<<1)+(x<<3)+(c^48);c=getchar();
24 }
25 return x;
26 }
27 void build(int x)
28 {
29 int p=1;
30 //printf("x=%lld ",x);
31 for(int i=n-1;i>=0;--i)
32 {
33 int th=((x>>i)&1);
34 //printf("i=%lld th=%lld\n",i,th);
35 if(T[p][th]==0)T[p][th]=++tot;
36 deep[T[p][th]]=bin[i];
37 p=T[p][th];
38 }
39
40 }
41 int maxn=0,ans=0;
42 void find(int p,int sum)
43 {
44 // printf("p=%lld sum=%lld\n",p,sum);
45 if((T[p][0]!=0&&T[p][1]==0))
46 {
47 sum|=deep[T[p][0]];
48 find(T[p][0],sum);
49 }
50 else if(T[p][0]==0&&T[p][1]!=0)
51 {
52 sum|=deep[T[p][1]];
53 find(T[p][1],sum);
54 }
55 else if(T[p][0]!=0&&T[p][1]!=0)
56 {
57 find(T[p][0],sum);
58 find(T[p][1],sum);
59 }
60 else
61 {
62 if(sum>maxn)
63 {
64 maxn=sum;
65 ans=1;
66 }
67 else if(sum==maxn)
68 {
69 ans++;
70 }
71 return ;
72 }
73 return ;
74 }
75 signed main()
76 {
77 n=read();m=read();
78 base=(1<<n);
79 pre[0]=0;
80 bin[0]=1;for(int i=1;i<=n;++i)bin[i]=(bin[i-1]<<1);
81 for(int i=1;i<=m;++i)
82 {
83 a[i]=read();
84 summ^=a[i];
85 pre[i]=pre[i-1]^a[i];
86 }
87 for(int i=0;i<=m;++i)
88 {
89 int sur=summ^pre[i],s;
90 s=((2*pre[i]/base)+2*pre[i])%base;
91 s^=sur;
92 build(s);
93 }
94 find(1,0);
95 printf("%lld\n%lld\n",maxn,ans);
96 }

最新文章

  1. bate阶段项目总结
  2. leaflet创建简单地图
  3. 使用Vue.js时,对Chrome控制台的一点小心得
  4. linux svn客户端 常用命令
  5. [转]System.Reflection.AssemblySignatureKeyAttribute
  6. RabbitMQ消息队列(一): Detailed Introduction 详细介绍(转)
  7. linux下的ImageMagick安装方法
  8. python网上开发执行环境
  9. [汇编学习笔记][第十七章使用BIOS进行键盘输入和磁盘读写
  10. 2016 ACM/ICPC Asia Regional Dalian ICPC大连现场赛
  11. jumpserver 堡垒机环境搭建(图文具体解释)
  12. lambda匿名函数透析
  13. 安卓startActivityForResult用法
  14. Prometheus Node_exporter
  15. java 持有对象 ListIterator用法
  16. 照葫芦画瓢之爬虫豆瓣top100
  17. es数据迁移脚本(python)
  18. 飞利浦 PHILIPS 电动牙刷HX6730 拆解
  19. Android如何实现TCP和UDP传输
  20. (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )

热门文章

  1. InnoDB解决幻读的方案——LBCC&amp;MVCC
  2. 加载usbserial驱动后,为什么adb不可用了?
  3. PHPcms v9.6.0 文件上传漏洞
  4. mouseenter mouseleave鼠标悬浮离开事件
  5. Gradle的环境安装与配置
  6. [DB] MapReduce 例题
  7. x小结:certutil -hashfile D:\1.exe MD5
  8. Ubuntu相关系统配置问题
  9. Mysql数据库基础增删改查常用语句命令
  10. 实例:使用playbook实现httpd安装、配置、以及虚拟主机的配置