【题目描述】
亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路。正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条。
亮亮拿起纸条的一端,只见上面写着打开机关的方法:“打开机关需要念动符咒,咒语是一串长为 L L L 的由 0 0 0和 1 1 1组成的字符串。在这张长纸条上列了 n n n个长为 L L L的字符串,正确的咒语即是在纷繁的 2 L 2^L 2L种字符串中,与这些纸条上的字符串相异度之和最小,并且在满足这一条件下, 0 0 0的个数最多的字符串。两个字符串的相异度定义为对应位置不相等的字符对的个数。如 ‘ 011 ’ ‘011’ ‘011’和 ‘ 001 ’ ‘001’ ‘001’的相异度为 1 1 1,因为它们有且只有第二个位置上的字符不相等。”
亮亮拉起纸条,只觉得纸条似乎永远也拉不完。这上面有着数以万计的字符串,而每一个字符串的长度也或百或千,以人力看来是无法得到正确的咒语。你 能帮帮他,让他得以进入魔法城堡,一窥其中的奥秘吗?
【输入格式】
第一行为一个数字 N N N。
接下来的 N N N行,每行为一个长为 L L L的 01 字符串。数据保证 N N N个字符串等长。
【输出格式】
只有一行,是一个长为 L L L的字符串 S S S,即为正确的咒语。
【样例输入】
4 01011 01001 01101 10111【样例输出】
01001【数据规模】
对于 20 % 20\% 20%的数据, N < = 5 N<=5 N<=5;
对于 60 % 60\% 60%的数据, N < = 100 N<=100 N<=100;
对于 100 % 100\% 100%的数据, 1 < = N < = 1000 1<=N<=1000 1<=N<=1000, 1 < = L < = 1000 1<=L<=1000 1<=L<=1000。
果然,模拟赛的第一题都是友善的。
用两个数组分别记录每一位上 0 0 0和 1 1 1的个数,然后比较哪个个数多即为哪个(若一样多则为 0 0 0)。
o v e r over over。
代码如下:
#include<bits/stdc++.h> #define N 1000+10 using namespace std; int n,L; int cnt0[N],cnt1[N]; char s[N]; int main(){ // freopen("curse.in","r",stdin); // freopen("curse.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",s+1); L=strlen(s+1); for(int j=1;j<=L;j++){ int t=s[j]-'0'; cnt0[j]+=1-t; cnt1[j]+=t; } } for(int i=1;i<=L;i++) if(cnt0[i]>=cnt1[i])printf("0"); else printf("1"); return 0; }