题目链接:https://vjudge.net/problem/UVA-1368
题目解析:字符串处理
题意是找出与所给多个字符串差距和最小的字符串,如果满足多个采用字典序最小的那个
注意:1.字典序最小,所以不能是AGCT,必须是ACGT
2.因为纵向比较,所以只需要循环每一列找出个数最多的那个
代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
int len,n;//字符串的长度和个数
int num;//样例的个数
char s[60][1100];
char ch[]= {"ACGT"};
int main()
{
cin>>num;
while(num--)
{
cin>>n>>len;
getchar();
for(int i=0; i<n; i++)
{
scanf("%s",s[i]);
}
int k[4]= {0};
char ans[1100];
int sum=0;
for(int j=0; j<len; j++)
{
memset(k,0,sizeof(k));
for(int i=0; i<n; i++)//统计字符的个数
{
for(int h=0; h<4; h++)
{
if(s[i][j]==ch[h])
{
k[h]++;
break;
}
}
}
int maxn=0;
for(int h=0; h<4; h++)
if(k[h]>maxn)
maxn=k[h];
int h;
for(h=0; h<4; h++)
if(k[h]==maxn)
{
ans[j]=ch[h];
break;
}
}
ans[len]=0;
for(int i=0; i<n; i++)
for(int hh=0; hh<len; hh++)
if(ans[hh]!=s[i][hh])
sum++;
cout<<ans<<endl;
cout<<sum<<endl;
}
return 0;
}