首先考虑一个xor为0的子集,如果去掉一个元素,那么xor就不等于0了,从而符合题意
去掉的元素肯定最小,或者说保留的元素最大,就可以使得ans最大
所以用贪心,从大到小取,用线性基维护一下即可,这是基于xor特殊性质的贪心
1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<cstring> 5 #include<vector> 6 #define MAXN 1000+10 7 #define ll long long 8 #define pb push_back 9 #define ft first 10 #define sc second 11 using namespace std; 12 ll s[65]; 13 int n; 14 pair<ll,int> a[MAXN]; 15 bool check(ll t){ 16 if(!t)return 0; 17 for(int i=63;i>=0;i--){ 18 if((t>>i)&1){ 19 t^=s[i]; 20 } 21 } 22 return (t==0); 23 } 24 void ins(ll t){ 25 for(int i=63;i>=0;i--){ 26 if((t>>i)&1){ 27 if(s[i]){ 28 t^=s[i]; 29 } 30 else{ 31 s[i]=t; 32 break; 33 } 34 } 35 } 36 } 37 bool comp(const pair<ll,int> &A,const pair<ll,int> &B){ 38 return (A.sc>B.sc); 39 } 40 int main() 41 { 42 scanf("%d",&n); 43 for(int i=1;i<=n;i++)scanf("%lld%d",&a[i].ft,&a[i].sc); 44 sort(a+1,a+n+1,comp); 45 int ans=0; 46 for(int i=1;i<=n;i++){ 47 if(!check(a[i].ft)){ 48 ans+=a[i].sc; 49 ins(a[i].ft); 50 } 51 } 52 printf("%d\n",ans); 53 return 0; 54 }