将所有元素按照魔法值从大到小排序,然后依次试着往线性基里插入就完事了. 

#include <cstdio> 
#include <algorithm> 
#define N 2000  
#define M 62    
#define ll long long 
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;  
int n; 
ll d[N];   
struct Node 
{
    ll val,magic; 
    Node(ll val=0,ll magic=0):val(val),magic(magic){}   
}e[N];   
bool cmp(Node a,Node b) 
{
    return a.magic>b.magic; 
}
int main() 
{ 
    ll re=0; 
    int i,j; 
    // setIO("input");  
    scanf("%d",&n); 
    for(i=1;i<=n;++i) scanf("%lld%lld",&e[i].val,&e[i].magic);   
    sort(e+1,e+1+n,cmp);     
    for(i=1;i<=n;++i) 
    {
        ll x=e[i].val,y=e[i].magic;        
        for(j=M;j>=0;--j) 
        { 
            if(x&(1ll<<j)) 
            {
                if(d[j]) x^=d[j]; 
                else 
                {
                    d[j]=x; 
                    re+=y;         
                    break; 
                }
            }
        }
    } 
    printf("%lld\n",re);   
    return 0; 
}