/*****************
* Author:fisty
* Data:2014-12-13
* uva 1368
* 竖着看选择出现次数最多的字母,
* 如果频率相同选择字典序小的字母
* **************/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
#define MAX_N 1010
int m, n;
string G[MAX_N];
char ss[MAX_N]; //重新构造的字符串
int sum[MAX_N]; //每一列的字母的最大hamming
void solve(int t){
//计算每一列的最高频字母保存在ss中,并且将这一列与ss中字母不同的保存到sum中
int num[MAX_N];
memset(num, 0, sizeof(num));
for(int i = 0;i < m; i++){
num[G[i][t]-'A']++;
}
int maxx = 0;
char q = 'A';
for(int i = 0;i <= 25; i++){
if(maxx < num[i]){
maxx = num[i];
q = i+'A';
}
}
ss[t] = q;
for(int i = 0;i < m; i++){
if(ss[t] != G[i][t]){
sum[t]++;
}
}
}
int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d%d", &m, &n);
for(int i = 0;i < m; i++){
string s;
cin >> s;
G[i] = s;
}
memset(ss, 0, sizeof(ss));
memset(sum ,0, sizeof(sum));
for(int i = 0;i < n; i++){
solve(i); //求第i列字典序最小字母
}
cout << ss << endl;
int ans = 0;
for(int i = 0; i < n; i++)
ans += sum[i];
printf("%d\n",ans);
}
return 0;
}
uva1368 字符串构造
最新推荐文章于 2019-04-23 14:52:07 发布