17~20WA,前面都能过,不知道为什么。。
#include <bits/stdc++.h>
using namespace std;
const long long Maxn=500005;
long long S[Maxn],n,k,root[Maxn],tot,t[Maxn][35],sum;
struct node{
long long siz,son[2];
}trie[40*Maxn];
struct Fuck{
long long r,val,K;
};
void Update(long long ii){
long long now;
if(ii==0){
root[0]=++tot;long long now=tot;
for(tot=2;tot<=33;++tot){
trie[now].son[0]=tot;
++trie[now].siz;
now=trie[now].son[0];
}
--tot;
++trie[now].siz;
return ;
}
root[ii]=++tot;
now=root[ii];long long renow=root[ii-1];
for(long long i=1;i<=32;++i){
trie[now]=trie[renow];++trie[now].siz;
trie[now].son[t[ii][i]]=++tot;
now=trie[now].son[t[ii][i]];
renow=trie[renow].son[t[ii][i]];
}
++trie[now].siz;
return ;
}
struct cmp1{
bool operator()(Fuck a,Fuck b){
return a.val<b.val;
}
};
long long Query(long long R,long long K){
long long now=root[R-1],r=1,ans=0;
while(r<=32){
ans*=2;
if(trie[trie[now].son[t[R][r]^1]].siz>=K)
now=trie[now].son[t[R][r]^1],ans+=t[R][r]^1;
else K-=trie[trie[now].son[t[R][r]^1]].siz,
now=trie[now].son[t[R][r]],ans+=t[R][r];
++r;
}
return ans;
}
int main(){
cin>>n>>k;
for(long long i=1;i<=n;++i) scanf("%lld",&S[i]),S[i]^=S[i-1];
tot=0;Update(0);
for(long long i=1;i<=n;++i){
long long s=S[i];
for(long long j=1;j<=32;++j){
t[i][33-j]=s&1;
s/=2;
}
}
for(long long i=1;i<=n;++i) Update(i);
priority_queue<Fuck,vector<Fuck>,cmp1>q;
long long ans=0;
for(long long i=1;i<=n;++i){
Fuck u;u.K=1;
u.r=i;u.val=S[i]^Query(i,1);q.push(u);
}
for(long long i=1;i<=k;++i){
Fuck u;u=q.top();q.pop();ans+=u.val;
if(u.K<u.r) ++u.K,u.val=S[u.r]^Query(u.r,u.K),q.push(u);
}
cout<<ans<<endl;
return 0;
}