[线性基 贪心] Topcoder SRM557Div1. XorAndSum

对数列建线性基,求出最大异或值

那么不在线性基里面的元素可以把它变成最大异或值

在线性基里的元素,可以把最高位的元素变成最大值,然后把其他数异或上最大值

#include 
#include 
#include 
#include 
#include 

using namespace std;

typedef long long ll;

const int N=55;

int n;
ll a[N];
ll b[N];

void add(ll x){
  for(int i=50;~i;i--)
    if(x>>i&1){
      if(!b[i]){
    b[i]=x;
    for(int j=0;jif(b[i]>>j&1) b[i]^=b[j];
    for(int j=50;j>i;j--)
      if(b[j]>>i&1) b[j]^=b[i];
    return; 
      }
      x^=b[i];
    }
}

class XorAndSum{
public:
  ll maxSum(vector number){
    n=number.size();
    for(int i=0;i1]=number[i];
    for(int i=1;i<=n;i++) add(a[i]);
    int cnt=0,lst=0;
    for(int i=0;i<=50;i++)
      cnt+=!!b[i],lst=b[i]?i:lst;
    ll Max=0;
    for(int i=0;i<=50;i++) Max^=b[i];
    ll ret=Max*(n-cnt+1);
    for(int i=lst-1;~i;i--)
      if(b[i]) ret+=Max^b[i];
    return ret;
  }
}Main;

int main(){
  vector a={27479, 32870, 34306, 34836, 34350, 26420, 32594, 33068, 31770, 27536, 30467, 27838, 35378, 36884, 36742, 38726};
  cout<for(;;);
}

你可能感兴趣的:(线性基,Thinking,Training)