#include<bits/stdc++.h> #define ll long long #define LL long long #define int long long using namespace std; const int maxn=1e4+10; int a[maxn]; int b[maxn]; int p[100]; int pp[100]; int32_t main() { int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]>>b[i]; for(int i=1;i<=n;i++) { for(int j=64;j>=0;j--) { if( (a[i]>>j) & 1 ) { if(!p[j]) { p[j]=a[i]; pp[j]=b[i]; break; } else { if(b[i]>pp[j]) { swap(b[i],pp[j]); swap(a[i],p[j]); } a[i]^=p[j]; } } } } int ans=0; for(int i=0;i<=64;i++) { ans+=pp[i]; } cout<<ans<<endl; }
另一种求线性基的方法
for (int i = 1; i <= n; i++) { scanf("%d", &t); for (int j = 0; j < base.size(); j++) if((t^base[j]) < t) t ^= base[j]; if(t) base.pb(t); }