思路:使用一个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;
- }
-
相关阅读:
认识并学会使用AJax
想定制Android系统实现改机?看完我也会了
AVL树的插入操作
Flutter学习笔记 -- Hello Flutter
小型ATC显示系统mini ATC Display
CAD与GIS集成说明(在线CAD结合GIS,webCAD)
学习java的第十八天。。。(子类)
面试突击61:说一下MySQL事务隔离级别?
salesforce零基础学习(一百三十一)Validation 一次的bypass设计
vue3 封装使用 pinia (可直接使用,包含数据持久化)
-
原文地址:https://blog.csdn.net/m0_62327332/article/details/126501522