D. Dr. Evil Underscores

给出n个数a[1]~a[n],用一个数x,令x xor a[i]的最大值最小,求这个最小值。
异或这个运算是每一位都独立运行的,显然,这题和二进制有关,所以我们应该把他们拆分成二进制来观察得出规律。显然如果某一位二进制上全是相同的0或者1,x相应的位置上应该和他们相同,这样肯定可以让最后的值变小。关键是有0有1怎么处理,刚开始我是想有0有1,这一位x无论是0还是1对最后答案的贡献都是1,然后直接当1处理就好了,然后继续处理剩下的位数。
实际上这是有问题的,前半句话是对的,但是,虽然无论当前这位选择0还是1最后对答案的贡献都是当前位变成1,但是选择1还是0会导致一部分的数字后面的位数不再产生有效的贡献。举个例子:
00110
01001
01101
10111
11001
11011
如果x第一位选择0异或之后(暂时不管x后面几位)就变成
0 * * * *
0 * * * *
0 * * * *
1 * * * *
1 * * * *
1 * * * *
显然后三个一定大于前三个,无论*代表什么数,所以只有后面三个数才具备继续讨论的必要,前三个数不可能是最大值,对答案也就没有贡献了。如果第一位选择1异或那么结果刚好相反。
所以问题到这里就很清晰了,按照二进制从左往右遍历,如果全是0或者1,当前位+0继续向下一位求解,如果有0有1,按照当前位是0还是1分成两个集合,分别求解子集合,我们选择更优的那个集合后将当前位的贡献加上。
我们可以用建立字典树(Trie)的方式(将每一个数的二进制当做字符串)建树,这样每一步向下有0还是1就很清晰了

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
inline LL read()
{
	LL kk=0,f=1;
	char cc=getchar();
	while(cc<'0'||cc>'9'){if(cc=='-')f=-1;cc=getchar();}
	while(cc>='0'&&cc<='9'){kk=(kk<<1)+(kk<<3)+cc-'0';cc=getchar();}
	return kk*f;
}
int trie[2000222][4],cnt=1;
void insert(int x)//按照二进制建立Trie
{
	int p=1;
	for(int i=30;i>=0;--i)
	{
		int now=(x>>i)&1;
		if(!trie[p][now])trie[p][now]=++cnt;
		p=trie[p][now];
	}
}
int search(int de,int p)
{
	if(de<0)return 0;
	if(!trie[p][0])return search(de-1,trie[p][1]);//有条路不通,说明只含一种0或1,当前位贡献为0
	if(!trie[p][1])return search(de-1,trie[p][0]);
	return (1<<de)+min(search(de-1,trie[p][1]),search(de-1,trie[p][0]));//分成两个子集分别求最小,选更小的那个,当前位贡献为(1<<de)
}
int main()
{
	LL n=read();
	for(int i=1;i<=n;++i)insert(read());
	int k=search(30,1);//默认每个数字都是30位
	cout<<k;
}
underscores_in_headers是一个nginx配置项,用于启用或禁用在客户端请求头字段中使用下划线。当禁用使用下划线时,请求头字段的名称中包含下划线的字段将被标记为无效,并受到ignore_invalid_headers指令的影响。默认情况下,underscores_in_headers属性为false,这意味着nginx将标记带有下划线的参数为无效。如果需要在nginx代理中传递带有下划线的参数,可以通过在nginx配置文件中添加underscores_in_headers on来解决这个问题。重启nginx后,参数将被正确传递到后台。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [会话丢失-NGINX配置之underscores_in_headers](https://blog.csdn.net/weixin_54823063/article/details/112991552)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [nginx配置的服务不生效underscores_in_headers](https://blog.csdn.net/hoho_12/article/details/124295861)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Nginx反向代理下滑线 access_token参数丢失 underscores_in_headers](https://blog.csdn.net/qq_26898033/article/details/128041231)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值