题意:给n个数对(x,y),选出任意多个,使任一子集的x抑或和不为0(x线性无关)
并使y的和最大
题解:按y从大到小加入,维护线性基,能加就加
线性基能表示出当前集合所有子集的抑或和,故正确性显然
#include<bits/stdc++.h>
using namespace std;
#define maxn 1020
#define rep(i,l,r) for(int i = l ; i <= r ; i++)
typedef long long ll;
struct node{
ll num;
int val;
bool operator < (node a)const{
return val > a.val;
}
}dt[maxn];
int n,ans;
ll matrix[66];
int check(ll x){
for (int i = 60 ; i >= 0 ; i--){
if ( (x >> i) & 1 ){
if ( !matrix[i] ){ matrix[i] = x; break; }
x ^= matrix[i];
}
}
if ( x ) return 1;
return 0;
}
int main(){
scanf("%d",&n);
for (int i = 1 ; i <= n ; i++) scanf("%lld %d",&dt[i].num,&dt[i].val);
sort(dt + 1,dt + n + 1);
for (int i = 1 ; i <= n ; i++){
if ( check(dt[i].num) ) ans += dt[i].val;
}
cout<<ans<<endl;
return 0;
}