这个是 AC 代码
#include<iostream>
#include<queue>
#include<cstring>
#define ll long long
using namespace std;
const int N=5e5+10;
int n,k;
ll a[N],s[N];
int trie[32*N][2],cnt[32*N],tot;
struct node{
ll w;
int x,y;
bool operator < (const node &a)const {
return w<a.w;
}
}d[N];
priority_queue<node>q;
void insert(ll v){
int u=0;
for(int i=31;i>=0;--i){
int z=(v>>i)&1;
if(!trie[u][z]) trie[u][z]=++tot;
u=trie[u][z];
++cnt[u];
}
}
ll find(ll v,int t){
ll s=0; int u=0;
for(int i=31;i>=0;--i){
int z=(v>>i)&1;
if(cnt[trie[u][z^1]]>=t){
u=trie[u][z^1];
s|=(1ll<<i);
}
else{
t-=cnt[trie[u][z^1]];
u=trie[u][z];
}
}
return s;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
a[i]^=a[i-1];//前缀和
}
for(int i=0;i<=n;++i) insert(a[i]);
k<<=1;
for(int i=0;i<=n;++i){
d[i].w=find(a[i],1);
d[i].x=i; d[i].y=1;
q.push(d[i]);
}
ll ans=0;
for(int i=1;i<=k;++i){
node h=q.top(); q.pop();
ans+=h.w;
d[h.x].y++;
d[h.x].w=find(a[h.x],d[h.x].y);
q.push(d[h.x]);
}
cout<<ans/2<<endl;
return 0;
}
但是如果把 trie 的 insert 改成这样,就死循环,请问是为什么。
void insert(ll v){
int u=0;
for(int i=(1<<31);i;i>>=1){
int z=bool(v&i);
if(!trie[u][z]) trie[u][z]=++tot;
u=trie[u][z];
++cnt[u];
}
}