初学 01Trie,码风不佳望见谅!
// Author:zymooll
#include<bits/stdc++.h>
#define getchar getchar_unlocked
#define putchar putchar_unlocked
using namespace std;
#define int unsigned int
int read(){
int s=0,w=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')w=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
s=s*10+c-'0';
c=getchar();
}
return s*w;
}
void print(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>=10)print(x/10);
putchar(x%10+'0');
return;
}
int n,k,ans,cnt=1;
struct Node{
int soncnt;
int son[2];
}trie[16000010];
int a[500010];
struct Save{
int w,x,y;
inline friend bool operator < (Save aa,Save bb){
return aa.w<bb.w;
}
};
priority_queue<Save>q;
void insert(int p,int i,int num){
if(i==-1)return;
trie[p].soncnt++;
if(!trie[p].son[0])trie[p].son[0]=++cnt;
if(!trie[p].son[1])trie[p].son[1]=++cnt;
int ls=(num>>i)&1LL;
insert(trie[p].son[ls],i-1,num);
}
int find(int p,int i,int num,int t){
//cerr<<p<<" "<<i<<" "<<num<<" "<<t<<"\n";
if(i==-1)return 0;
int ls=(num>>i)&1LL;
if(trie[trie[p].son[ls^1]].soncnt>=t){
//cerr<<ls<<"->"<<(ls^1)<<endl;
return find(trie[p].son[ls^1],i-1,num,t)+(1LL<<i);
}
else{
//cerr<<ls<<"->"<<ls<<endl;
return find(trie[p].son[ls],i-1,num,t-trie[trie[p].son[ls^1]].soncnt);
}
}
signed main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=read(),k=read();
for(int i=1;i<=n;i++){
a[i]=read();
a[i]^=a[i-1];
}
for(int i=1;i<=n;i++){
insert(1,31,a[i]);
}
for(int i=1;i<=n;i++){
q.push((Save){find(1,31,a[i],1),i,1});
}
for(int i=1;i<=2*k;i++){
Save ls=q.top();
q.pop();
ans+=ls.w;
q.push((Save){find(1,31,a[ls.x],++ls.y),ls.x,ls.y});
}
print(ans/2);
return 0;
}