CODE:
//完整缺省源请见洛谷云剪贴板 jo5j6ogx
const int N=5e5,M=32;
struct node{
ll x;
int p;
int k;
};
il bool operator<(const node a,const node b){
ret a.x<b.x;
}
priority_queue<node>q;
int n,k,trie[N*M+10][3],tot=1,cnt[N*M+10];
ll a[N+10],ans;
il void insert(ll x){
int u=1,c;
for(ll i=31;i>=0;i--){
c=(x>>i)&1;
cnt[u]++;
if(!trie[u][c]){
trie[u][c]=++tot;
}
u=trie[u][c];
}
cnt[u]++;
}
il ll query(ll x,int rk){
int u=1,c;
ll ans=0;
for(ll i=31;i>=0;i--){
c=(x>>i)&1;
if(!trie[u][!c]){
u=trie[u][c];
}else if(cnt[trie[u][!c]]>=rk){
u=trie[u][!c];
ans|=(1ll<<i);
}else{
u=trie[u][c];
rk-=cnt[trie[u][!c]];
}
}
ret ans;
}
int main(void){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
n=read<int>();
k=read<int>();
for(int i=1;i<=n;i++){
a[i]=read<ll>();
a[i]^=a[i-1];
}
for(int i=0;i<=n;i++){
insert(a[i]);
}
for(int i=0;i<=n;i++){
q.push(node{query(a[i],1),i,1});
}
for(int i=1;i<=2*k;i++){
int p=q.top().p,r=q.top().k;
ans+=q.top().x;
q.pop();
if(r<n){
q.push(node{query(a[p],r+1),p,r+1});
}
}
write(ans/2);
ret 0;
}
一组 hack:
输入:
7 21
5 4 9 9 3 5 10
输出:
183