LINK:再见Xor
求一个序列中 异或最大值 和 异或严格次大值。
显然 线性基可以异或出序列的任何值。所以我们从高位到低位贪心就可以求出最大值。
考虑严格次大值 可以发现我们求出最大值之后需要再异或一个数字 或多个数字让最大值变得更小。
不满足单调性 所以不能二分 我们考虑去掉一个最小的数字就是严格次大 显然最小的数字为线性基中最小的那个数字。
去掉即可。
int n;
int f[32];
inline void insert(int x)
{
for(int i=30;i>=0;--i)
{
if(x&(1<<i))
{
if(!f[i]){f[i]=x;break;}
else x=x^f[i];
}
}
}
int main()
{
freopen("1.in","r",stdin);
get(n);
rep(1,n,i)insert(read());
int maxx=0,minn;
for(int i=30;i>=0;--i)
{
if((maxx^f[i])>maxx)maxx=maxx^f[i];
if(f[i])minn=f[i];
}
printf("%d %d
",maxx,maxx^minn);
return 0;
}