线性基。
求次大值就是再异或一个线性基好了。
#include<iostream> #include<cstdio> #include<cstring> #define maxn 100050 using namespace std; int n,a[maxn],ins[maxn]; 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=30;j>=0;j--) { if (a[i]&(1<<j)) { if (!ins[j]) { ins[j]=a[i]; break; } else a[i]^=ins[j]; } } } int ans1=0,ans2=0; for (int i=30;i>=0;i--) if ((ans1^ins[i])>ans1) ans1^=ins[i]; for (int i=30;i>=0;i--) if ((ans1^ins[i])<ans1) ans2=max(ans2,(ans1^ins[i])); printf("%d %d\n",ans1,ans2); return 0; }