Fork me on GitHub

Codeforces 1285D-Dr. Evil Underscores

Codeforces 1285D-Dr. Evil Underscores

题意

给一个数组an,求一个数\(x\),使得\(max\) ai \(\bigoplus x\)最小,输出最小值。

题解

把所有数字的二进制代码(从高位到低位)建成Trie树。
1、如果第k为只有一个儿子(0/1),那么我们就可以构造x的第k为也为(0/1),这样该位异或结果为0,对答案没有贡献。再solve其儿子即可。
2、如果第k位有0和1两个儿子,那么答案就要加上(2k)和左儿子、右儿子答案中的较小值。

代码

#include<iostream>
#include<cstdio>

using namespace std;
typedef long long ll;
const int N=1e3+10;
int n,m;
char s1[N],s2[N];
ll dp[N][N];
int main(){
	while(scanf("%d%s%d%s",&n,s1+1,&m,s2+1)!=EOF){
		for(int i=1;i<=m;i++) dp[0][i]=i;
		for(int i=1;i<=n;i++) dp[i][0]=i;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				int x;
				if(s1[i]==s2[j]) x=0;
				else x=1;
				dp[i][j]=min(dp[i-1][j]+1,min(dp[i][j-1]+1,dp[i-1][j-1]+x));
			}
		}
		printf("%lld\n",dp[n][m]);
	}
	return 0;
}
posted @ 2020-03-22 22:15  qjy_73  阅读(144)  评论(0)    收藏  举报