长沙建站找有为太极就治就,个人网站设计论文模板,做网站送商标,高新网站开发1年经验正题
题目链接:https://loj.ac/problem/10050 题目大意
有n个数#xff0c;求两个数使他们异或起来最大。 解题思路
我们考虑构建一个TrieTrie。 两个分叉为0,1#xff0c;对于每个数二进制下不够30位我们将其补够30位#xff0c;然后再根据二进制01构建TrieTrie。 然后…正题
题目链接:https://loj.ac/problem/10050 题目大意
有n个数求两个数使他们异或起来最大。 解题思路
我们考虑构建一个TrieTrieTrie。 两个分叉为0,1对于每个数二进制下不够30位我们将其补够30位然后再根据二进制01构建TrieTrieTrie。 然后我们再次枚举一边然后依旧是补位转二进制然后每次尽量走反方向的边在路上统计一下取最小值就是答案。 code
#includecstdio
#includealgorithm
#define N 100010
using namespace std;
int n,l[N*40][2],x,tot,a[N];
int maxs;
int main()
{scanf(%d,n);for(int i1;in;i){scanf(%d,a[i]);int now0;for(int j30;j0;j--)//构建{x(a[i]j)1;if(!l[now][x]) l[now][x]tot;nowl[now][x];}}for(int i1;in;i){int now0;int ans0;for(int j30;j0;j--)//查询{x((a[i]j)1)^1;//反位if(!l[now][x]) nowl[now][x^1];else{ans1j;nowl[now][x];}}maxsmax(maxs,ans);}printf(%d,maxs);
}