//
现在做的话应该是用结构体排序直接选出字符, 是道很水的模拟题了, 还是原来的blog上的代码
//
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<ctype.h>
char str[1000][1000];
char res[1001];
int main()
{
int n,count;
scanf("%d",&n);
for(count=1;count<=n;count++)
{
int p,q;
int i,j;
scanf("%d%d",&p,&q);
getchar();
//输入
for(i=0;i<p;i++)
{
gets(str[i]);
}
for(i=0;i<q;i++)
{
res[i]='A';
}
//目标初始化
int num_A=0,num_C=0,num_G=0,num_T=0,max=0;
for(i=0;i<q;i++)
{
num_A=0,num_C=0,num_G=0,num_T=0,max=0;
for(j=0;j<p;j++)
{
if(str[j][i]=='A')
{
num_A++;
if(max<num_A)
{
max=num_A;
res[i]='A';
continue;
}
if(max==num_A&&res[i]>str[j][i])
{
max=num_A;
res[i]='A';
continue;
}
}
if(str[j][i]=='C')
{
num_C++;
if(max<num_C)
{
max=num_C;
res[i]='C';
continue;
}
if(max==num_C&&res[i]>str[j][i])
{
max=num_C;
res[i]='C';
continue;
}
}
if(str[j][i]=='G')
{
num_G++;
if(max<num_G)
{
max=num_G;
res[i]='G';
continue;
}
if(max==num_G&&res[i]>str[j][i])
{
max=num_G;
res[i]='G';
continue;
}
}
if(str[j][i]=='T')
{
num_T++;
if(max<num_T)
{
max=num_T;
res[i]='T';
continue;
}
if(max==num_T&&res[i]>str[j][i])
{
max=num_T;
res[i]='T';
continue;
}
}
}
}
int x=0;
for(i=0;i<q;i++)
{
for(j=0;j<p;j++)
{
if(res[i]!=str[j][i])
x++;
}
}
printf("%s\n",res);
printf("%d\n",x);
memset(str,0,sizeof(str));
memset(res,0,sizeof(res));
}
return 0;
}