可以用拟阵证明按价值从大到小取一定是正确的,维护一个线性基判断异或和是否会变成 0 <script type="math/tex" id="MathJax-Element-46">0</script>就可以了。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1010
#define ll long long
#define M 64
struct Node{
ll x;
int y;
}c[N];
ll a[M];
int i,j,k,n,m,Ans;
inline bool Cmp(Node a,Node b){
return a.y>b.y;
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%lld%d",&c[i].x,&c[i].y);
sort(c+1,c+n+1,Cmp);
for(i=1;i<=n;i++){
for(j=M-1;j;j--)
if(c[i].x&(1ll<<j-1))
if(!a[j]){
a[j]=c[i].x;
break;
}else c[i].x^=a[j];
if(c[i].x)Ans+=c[i].y;
}
printf("%d\n",Ans);
return 0;
}