思路:使用一个0和1的二叉树存储所有二进数,输入一个存一个再找一次,不用全部存进去后再找。为了使异或值最大,每一次查找和输入的a每一位都不同的方向(如果有的话),最后返回查找值。
代码:
- #include
- #include
- #include
- #include
- using namespace std;
- const int N=3e6+10;
- int son[N][2],idx;
- int n;
- void insert(int x)
- {
- int p=0;
- for(int i=30;i>=0;i--)
- {
- int u=x>>i&1;
- if(!son[p][u]) son[p][u]=++idx;
- p=son[p][u];
- }
- }
- int que(int x)
- {
- int p=0,res=0;
- for(int i=30;i>=0;i--)
- {
- int u=x>>i&1;
- if(son[p][!u])
- {
- p=son[p][!u];
- res=res*2+!u;
- }else
- {
- p=son[p][u];
- res=res*2+u;
- }
- }
- return res;
- }
- int main()
- {
- cin>>n;
- int a;
- int res=0;
- for(int i=1;i<=n;i++)
- {
- cin>>a;
- insert(a);
- int t=que(a);
- res=max(res,a^t);
- }
- cout<
- return 0;
- }
在查询时异或,直接返回当前数字能够异或到的最大的值,不需要得到一个返回值后再异或一次
- #include
- #include
- #include
- #include
- using namespace std;
- typedef unsigned long long ull;
- const int N=3e6+10;
- int son[N][2],idx;
- int cnt[N];
- string s[10010];
- int flag;
- void insert(int a)
- {
- int p=0;
- for(int i=30;i>=0;i--)
- {
- int u=a>>i&1;
- if(!son[p][u]) son[p][u]=++idx;
- p=son[p][u];
- }
- }
- int que(int x)
- {
- int p=0,res=0;
- for(int i=30;i>=0;i--)
- {
- int u=x>>i&1;
- if(son[p][!u])
- {
- p=son[p][!u];
- res=res*2+1;
- }else
- {
- p=son[p][u];
- res=res*2;
- }
- }
- return res;
- }
- int main()
- {
- int n;
- scanf("%d",&n);
- int sum=0;
- for(int i=1;i<=n;i++)
- {
- int a;
- scanf("%d",&a);
- insert(a);
- int t=que(a);
- sum=max(sum,t);
- }
- cout<
- return 0;
- }
-
相关阅读:
Java获取Jar、War包路径,并生成可编辑修改的本地配置文件
【内网穿透】远程访问RabbitMQ服务
搭建selenium环境
5G“升级版”:5G-A正当其时
阿里p8实战总结SpringCloud微服务分布式系统文档
LLM模型-讯飞星火与百度文心api调用
解决sass问题:npm ERR! node-sass@9.0.0 postinstall: `node scripts/build.js`
Django——orm模块创建表关系
GBase 8c V3.0.0数据类型——类型转换函数
MySQL数据库如何线上修改表结构
-
原文地址:https://blog.csdn.net/m0_62327332/article/details/126501522