- #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);
- }
来源: http://www.bubuko.com/infodetail-2987133.html