求助01Trie树板子题
  • 板块题目总版
  • 楼主Waaifu_D
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/7/27 10:45
  • 上次更新2023/10/27 18:12:31
查看原帖
求助01Trie树板子题
358779
Waaifu_D楼主2022/7/27 10:45

在给定的 NN 个整数 A1,A2,A3...ANA_1,A_2,A_3...A_N 中选出两个进行异或运算,得到的结果最大是多少?

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,a[100005];
int c[3100005][2];
int cnt,ans;
inline void cinsert(int x)
{
	int pos=0;
	for(register int i=32;i>=0;i--)
	{
		int k=(x>>i)&1;
		if(c[pos][k]==-1)
		{
			cnt++;
			c[pos][k]=cnt;
		}
		pos=c[pos][k];
	}
}
inline int query(int x)
{
	int pos=0;
	for(register int i=32;i>=0;i--)
	{
		int k=(x>>i)&1;
		if(c[pos][1-k]!=-1)
		{
			ans=ans+(1<<i);
			pos=c[pos][1-k];
		}
		else pos=c[pos][k];
	}
	return ans;
}
int main()
{
	for(register int i=0; i<=3100000;i++)
	{
		c[i][0]=c[i][1]=-1;
	}
	cin>>n;
	for(register int i=1; i<=n;i++)
	{
		scanf("%d",&a[i]);
		cinsert(a[i]);
	}
	for(register int i=1; i<=n;i++)
	{
		ans=max(ans,query(a[i]));
	}
	cout<<ans;
	return 0;
}

MnZn用的把数字的二进制倒着存入trie树,然后贪心选择高位上能为1。

样例
样例输入
5
2 9 5 7 0 
样例输出
14

我输出的是50...

2022/7/27 10:45
加载中...