题目连接:
https://vjudge.net/problem/UVA-1368
求与给出的序列匹配的汉明距离最小的序列
思路:匹配序列的每一位取出现次数最的字母
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 1050;
char A[maxn], T[maxn], C[maxn], G[maxn];
struct node {
int i;
char c;
bool operator<(const node rhs)const {
return i < rhs.i || (i == rhs.i&&c > rhs.c);
}
};
int main() {
//freopen("Text.txt", "r", stdin);
int t;
while (scanf("%d", &t) != EOF) {
while (t--) {
int i, j, m, n;
char min_str[maxn];
memset(min_str, '\0', sizeof(min_str));
memset(A, 0, sizeof(A));
memset(C, 0, sizeof(C));
memset(G, 0, sizeof(G));
memset(T, 0, sizeof(T));
scanf("%d %d", &n, &m);
for (i = 0; i < n; i++) {
char s[maxn];
scanf("%s", s);
for (j = 0; j < m; j++) {
if (s[j] == 'A')A[j]++;
if (s[j] == 'C')C[j]++;
if (s[j] == 'G')G[j]++;
if (s[j] == 'T')T[j]++;
}
}
int min_hash = 0;
for (i = 0; i < m; i++) {
struct node a[4] = { {A[i],'A'},{C[i],'C'},{G[i],'G'},{T[i],'T'} };
sort(a, a + 4);
//cout << "a[0].i=" << a[3].i << endl;
min_str[i] = a[3].c;
min_hash += n - a[3].i;
}
printf("%s\n%d\n", min_str,min_hash);
}
}
return 0;
}