求助大佬
查看原帖
求助大佬
300735
HL_Imrt楼主2024/8/10 22:02
#include<iostream>
#include<queue>
using namespace std;
const int N=500050;
int n,k,son[32*N][3],cnt,sum[N],th[N],len=30;
long long w[N],ans;
struct aaa{
    long long num;
    int idx;
    friend bool operator < (aaa a,aaa b){
        return a.num<b.num;
    }
}mxa;
priority_queue<aaa>qa;
void insert(long long x){
    int p=0,ls;
    for(int i=len;i>=0;i--){
        ls=(x>>i)&1;
        ++sum[p];
        if(!son[p][ls]) son[p][ls]=++cnt;
        p=son[p][ls];
    }
    ++sum[p];
}
long long query(long long x,int k){
    int p=0,ls;
    long long tl=0;
    for(int i=len;i>=0;i--){
        ls=(x>>i)&1;
        if(!son[p][ls^1]) p=son[p][ls];
        else if(k<=sum[son[p][ls^1]]) p=son[p][ls^1],tl|=(1ll<<i);
        else k-=sum[son[p][ls^1]],p=son[p][ls];
    }
    return tl;
}
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>w[i],w[i]=w[i]^w[i-1];
    for(int i=0;i<=n;i++) insert(w[i]);
    for(int i=0;i<=n;i++) qa.push((aaa){query(w[i],1),i}),th[i]=1;
    for(int i=1;i<=2*k;i++){
        mxa=qa.top(),ans+=mxa.num;
        qa.pop();
        if(th[mxa.idx]<n) qa.push((aaa){query(w[mxa.idx],++th[mxa.idx]),mxa.idx});
    }
    cout<<ans/2<<endl;
    return 0;
}
2024/8/10 22:02
加载中...