UVA刷题方法:https://blog.csdn.net/richenyunqi/article/details/80990535#commentBox
【2019.3.25】
上完了一天的课,被老师藐视一通,被生活暴捶一顿,
回到宿舍里,洗个热水澡,来一杯冷藏酸奶,敲一段代码,舒服……
……然后第一次提交就来了个Runtime error……
50*1000的测例不过关,一开始以为是输入数据过大,吓得我把所有cout都改成了printf,然后又吭哧吭哧改了半天,才发现下面这条错误提示:
Process returned -1073741819(0xc0000005)
上网搜了下发现这种情况一般是【指针/内存使用不当】,发现自己有个数组开小了,一直getchar估计越界了……
反正最后AC了,舒服……
思路是:
将输入数据看成一个字符方阵,对于每一列,需要找出该列出现次数最多的字符,并记录其出现的次数
最后用总字符个数(m*n)减去每一列的最大出现次数,得到Hamming距离和
num[i][j],用于储存第 i 列中,字符 j 的出现次数,j的取值只有四个,分别为【‘A’-‘A’】【’T‘-’A’】【‘G’-‘A’】【‘C’-‘A’】
DNA[4]是按字母序排列的,用于在num[][]中,比较出现次数的最大值
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int num[1010][30];
char DNA[4]={'A','C','G','T'};
int main()
{
//freopen("C:\\Users\\summer\\Desktop\\output.txt","w",stdout);
int T;
scanf("%d",&T);
getchar();
int m,n;
char c;
while(T--) {
scanf("%d %d", &m, &n);
getchar();
memset(num, 0, sizeof(num));
//输入数据
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
c=getchar();
num[j][c-'A']++; //记录第j列中,字符c的出现次数
}
getchar();
}
//输出数据
int maxnum; //第j列中,最大的出现次数
int maxj; //记录出现次数最多的字符序号,0=A,1=C,2=G,3=T
int len=m*n; //用总字符个数减去各列的最大出现次数,得到Hamming
for(int j=0; j<n; j++) { //对于每一列
maxnum=maxj=0;
for(int k=0; k<4; k++) { //对于每种字符(按字母序比较)
if(num[j][DNA[k]-'A']>maxnum) {
maxnum=num[j][DNA[k]-'A']; //记录最大次数
maxj=k;
}
}
printf("%c",DNA[maxj]); //输出出现次数最多的字符
len-=maxnum;
}
printf("\n%d\n",len); //输出Hamming距离和
}
return 0;
}