【题解】咒语

【题目描述】

亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路。

正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条。 亮亮
拿起纸条的一端,只见上面写着打开机关的方法:“打开机关需要念动符咒,咒
语是一串长为 L 的由 0 和 1 组成的字符串。在这张长纸条上列了 n 个 长为 L
的字符串,正确的咒语即是在纷繁的 2^L 种字符串中,与这些纸条上的 字符串
相异度之和最小,并且在满足这一条件下,0 的个数最多的字符串。两个字符串的
相异度定义为对应位置不相等的字符对的个数。如‘011’和‘ 001’的 相异度为 1, 因为它们有且只有第二个位置上的字符不相等。”
亮亮拉起纸条,只觉得纸条似乎永远也拉不完。这上面有着数以万计的字符
串,而每一个字符串的长度也或百或千,以人力看来是无法得到正确的咒语。你能 帮帮他,让他得以进入魔法城堡,一窥其中的奥秘吗?

【输入格式】

第一行为一个数字 N 。 接下来的 N 行,每行为一个长为 L 的 01 字符串。数据保证 N 个字符串等长。

【输出格式】

只有一行,是一个长为 L 的字符串 S,即为正确的咒语。

【样例输入】

4
01011
01001
01101
10111

【样例输出】

01001

【数据规模】

对于 20%的数据,N<=5; 对于 60%的数据,N<=100; 对于 100%的数据,1<=N<=1000,1<=L<=1000。

思路

竖着看字符串,每列0多的,答案的那一位就是0,1多的,答案的那一位就是一,如果0和1一样多的,答案的那一位就是0(因为题目要求“并且在满足这一条件下,0 的个数最多的字符串”)

code

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int n,l;
struct node{
    
    
	int zero,one;
}cnt[N];
char c,s[N];
int main()
{
    
    
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	{
    
    
		scanf("%s",s);
		int l=strlen(s);
		for (int j=0;j<l;j++)
		{
    
    
			if (s[j]=='0') cnt[j+1].zero++;
			else cnt[j+1].one++;
		}
	}
	int l=strlen(s);
	for (int i=1;i<=l;i++)
	{
    
    
		if (cnt[i].zero>=cnt[i].one) putchar('0');
		else putchar('1');
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45485187/article/details/102869404