【题目描述】
亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路。
正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条。 亮亮
拿起纸条的一端,只见上面写着打开机关的方法:“打开机关需要念动符咒,咒
语是一串长为 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;
}