Trie 0pts 求调
查看原帖
Trie 0pts 求调
289296
zymooll楼主2023/4/24 14:06

初学 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;
}

2023/4/24 14:06
加载中...