首先构造线性基求出最大的异或值,然后再用最大的异或值异或最小的线性基就是次大值。线性基这玩意比较好玩但是很迷,证明还是简单就不说了。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,a[100021],ins[35],ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",a+i);
for(int i=1;i<=n;i++){
for(int j=31;j>=0;j--)if((a[i]>>j)&1){
if(!ins[j]){ins[j]=a[i];break;}
else a[i]^=ins[j];
}
}
for(int i=31;i>=0;i--)ans=max(ans,ans^ins[i]);
cout<<ans<<" ";
for(int i=0;i<=31;i++)if(ins[i]){
ans^=ins[i];
cout<<ans;
break;
}
return 0;
}