这题也是题目吓人,写起来不难,文字一大长串,前面都是没用的话,笑话,在中国DNA早就学烂了,题目就是要找一列中重复次数最多的那个字母,如果重复次数相同,就选字典序最小的。直接用map一直都是WA,检查了好久,都没问题,实在忍不住,就重新来过,用了死办法,一下就A了,玄学。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
using namespace std;
char a[55][1010];
map<char, int>q;
map<int, char>p;
int nub[5][1010];
int n, m;
int Number(char s[]) {
int cnt = 0;
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
if (s[j] != a[i][j]) cnt++;
return cnt;
}
int main() {
int t;
cin >> t;
q['A'] = 1; q['C'] = 2; q['G'] = 3; q['T'] = 4;
p[1] = 'A'; p[2] = 'C'; p[3] = 'G'; p[4] = 'T';
while (t--) {
char ans[1010];
cin >> m >> n;
memset(nub, 0, sizeof(nub));
for (int i = 1; i <= m; i++) {
getchar();
for (int j = 1; j <= n; j++) {
scanf("%c", &a[i][j]);
nub[q[a[i][j]]][j]++;
}
}
for (int j = 1; j <= n; j++) {
int maxn = 0;
for (int i = 1; i <= 4; i++) {
if (maxn < nub[i][j]) {
ans[j] = p[i];
maxn = nub[i][j];
}
}
}
int cnt = Number(ans);
for (int i = 1; i <= n; i++)
printf("%c", ans[i]);
printf("\n%d\n", cnt);
}
return 0;
}