8 条题解
-
1
本蒟第二次发题解,多多包涵 AC Code:
#include<bits/stdc++.h> #include<cstdlib> using namespace std; const int N=31000010; //son数组用于存储字典树的节点,cnt数组用于记录叶节点的个数 int son[N][2]; int cnt[N]; //idx用于记录当前使用的节点编号 int idx=0; /** *读取输入的整数,处理EOF情况 *@return 读取的整数,如果遇到EOF则退出程序 */ int read(){ int x=0,f=1; char ch=getchar(); if(ch==EOF) exit(EXIT_FAILURE); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); if(ch==EOF) exit(EXIT_FAILURE); } while('0'<=ch&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); if(ch==EOF) break; } return x*f; } /** *向字典树中插入一个数 *@param x 要插入的数 */ void insert(int x){ int p=0; for(int i=31;i>=0;i--){ int u=(x>>i)&1; if(!son[p][u]) son[p][u]=++idx; p=son[p][u]; } cnt[p]++; } /** *在字典树中查找与给定数最大异或的结果 *@param x 给定的数 *@return 与给定数最大异或的结果 */ int find(int x){ int p=0,res=0; for(int i=31;i>=0;i--){ int u=(x>>i)&1; if(son[p][!u]){ p=son[p][!u]; res+=1<<i; } else{ p=son[p][u]; } } return res; } //主函数 int main(){ int n=read(); int a[N]; for(int i=1;i<=n;i++){ a[i]=read(); insert(a[i]); } int res=0x80808080; for(int i=1;i<=n;i++){ res=max(res,find(a[i])); } printf("%d\n",res); return 0; }
原创不易,切勿抄袭
信息
- ID
- 94
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 738
- 已通过
- 173
- 上传者