Codeforces - Vitya and Strange Lesson

题目链接:Codeforces - Vitya and Strange Lesson


逆向思维。显然不可能每次改变数列,我们通过异或的性质,改变一个数字,然后用这个数字查询的时候异或数列即可。

怎么找最小呢?

我们把未出现的数字放到Tire当中,而不是放出现过的。那么找异或min即为答案。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=3e5+10;
int n,m,vis[N<<1],t[N*30][2],s,x,idx;
inline void insert(int x){
	int p=0;
	for(int i=20;i>=0;i--){
		int k=x>>i&1;
		if(!t[p][k])	t[p][k]=++idx;
		p=t[p][k];
	}
}
inline int ask(){
	int res=0,p=0;
	for(int i=20;i>=0;i--){
		int k=s>>i&1;
		if(t[p][k])	p=t[p][k];
		else	res|=(1<<i),p=t[p][k^1];
	}
	return res;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)	scanf("%d",&x),vis[x]=1;
	for(int i=0;i<=6e5;i++)	if(!vis[i])	insert(i);
	while(m--){
		scanf("%d",&x);	s^=x;	printf("%d\n",ask());
	}
	return 0;
}
发布了579 篇原创文章 · 获赞 242 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104317463
今日推荐