Trie 板子求调
查看原帖
Trie 板子求调
664744
_lqs_楼主2023/9/2 16:55
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int n,m,i,j,ans,a[N],dp[N*30],c[35],Pow[35],Max,num;
struct ren{int ch[2];}d[N*30]; 
void f(int x){
	for(int i=30;i>=0;i--) if(x>=Pow[i]) x-=Pow[i],c[i]=1,Max=max(Max,i);
	for(int i=0,j=30;i<=j;i++,j--) swap(c[i],c[j]);
}
void upd(){
	int p=0;
	for(int i=30-Max;i<=30;i++){
		if(!d[p].ch[c[i]]) d[p].ch[c[i]]=++num;
		p=d[p].ch[c[i]];
	}
}
void dfs(int k,int b){
	int cnt=0;
	if(d[k].ch[0]) cnt++,dfs(d[k].ch[0],b-1),dp[k]=min(dp[k],dp[d[k].ch[0]]);
	if(d[k].ch[1]) cnt++,dfs(d[k].ch[1],b-1),dp[k]=min(dp[k],dp[d[k].ch[1]]);
	if(cnt==0) dp[k]=0;
	if(cnt==2) dp[k]+=Pow[b];
}
int main(){
	Pow[0]=1;for(i=1;i<=31;i++) Pow[i]=Pow[i-1]<<1;
	scanf("%d",&n);
	memset(dp,1,sizeof(dp));
	for(i=1;i<=n;i++) scanf("%d",&a[i]);
	for(i=1;i<=n;i++){
		for(j=0;j<=30;j++) c[j]=0;
		f(a[i]);
	}
	for(i=1;i<=n;i++){
		for(j=0;j<=30;j++) c[j]=0;
		f(a[i]),upd();
	}
	dfs(0,Max);
	printf("%d\n",dp[0]);
	return 0;
}

思路是把每个数转二进制丢进 Trie 里,然后跑树形 dp,但是 WA on #6

2023/9/2 16:55
加载中...