WA求助
查看原帖
WA求助
547238
篮网总冠军楼主2025/7/18 23:57
#include <bits/stdc++.h>
using namespace std;

long long ans;
int cnt;
int a[200005];
string s[200005];
int ou;
struct node{
	int a[2],sum,p;
}trie[2000005];
void add(string s0){
	int w=0;
	trie[w].p=ou;
	for(int i=0;i<s0.length();i++){
		int s=trie[w].a[s0[i]-'0'];
		if (s==0){
			int oi=++cnt;
			trie[oi].p=ou,trie[w].a[s0[i]-'0']=oi;
		} 
		else{
			if (trie[s].p!=ou) trie[s].a[0]=trie[s].a[1]=trie[s].sum=0,s=++cnt,trie[s].p=ou;
			else w=s;
		}
	}
	trie[w].sum++;
}
int q(string s){
	int ans=0,w=0,rt=1<<29;
	for(int i=0;i<s.length();i++){
		int r=s[i]-'0';
		r=!r;
		if ((rt!=(1<<29)&&w==0)||trie[w].p!=ou||trie[w].a[r]==0||trie[trie[w].a[r]].p!=ou) ans+=rt,w=trie[w].a[!r];
		else w=trie[w].a[r];
	}
	return ans;
}
void dfs(int w,int l,int r){
	if (l==r) return;
	int po=0;
	for(int i=l;i<=r;i++){
		if (s[i][w]=='1'){
			po=i;
			break;
		}
	}
	if (po==0) dfs(w+1,l,r);
	else{
		ou++;
		for(int i=l;i<=po-1;i++){
			add(s[i]);
		} 
		int rt=1<<30;
		for(int i=po;i<=r;i++){
			rt=min(rt,q(s[i]));
		}
		ans+=rt;
		dfs(w+1,l,po-1);
		dfs(w+1,po,r);
	}
}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		int x=a[i];
		string rt;
		while(x){
			rt+=(x%2+'0');
			x/=2;
		}
		while(rt.length()<30) rt+='0';
		for(int j=rt.length()-1;j>=0;j--){
			s[i]+=rt[j]; 
		}
	}
	sort(a+1,a+1+n);
	dfs(0,1,n);
	cout<<ans<<endl;
	return 0;
}

2025/7/18 23:57
加载中...