怕不是学了个假的线性基。。。一直以为要高位到低位插入,结果那个是高斯消元的线性基。。。
那么直接排序权值就行了。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<map> using namespace std; typedef long long LL; struct node{LL num;int d;}a[1100]; bool cmp(node n1,node n2){return n1.d>n2.d;} LL lt[110];int ans; void insert(LL k) { for(int i=62;i>=0;i--) if(a[k].num&(1LL<<i)) { if(lt[i]==0) { lt[i]=a[k].num; ans+=a[k].d; return ; } else a[k].num^=lt[i]; } } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lld%d",&a[i].num,&a[i].d); sort(a+1,a+n+1,cmp); ans=0; for(int i=1;i<=n;i++)insert(i); printf("%d ",ans); return 0; }