紫书——DNA Consensus String UVA - 1368

本文介绍了一道关于字符串匹配的问题解决方案,通过遍历每个字符串并统计每列字符出现次数的方法找到每列最多的字符,并计算出非最多字符的总数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题解:

又是难在读题目的问题,这道题的想法是这样的。

有m个字符串,然后输出所有字符串每列字符数最多的,其他不同的要加起来。如果一列中'A'和'T'相同,则输出字典序最小的'A'

代码如下:注意字典序

#include <bits/stdc++.h>
using namespace std;

#define inf 0x3f3f3f3f

int n,m;
string str[60];
map<char,int> num;	//保存每列最多的字母 

void init(){	//每次的初始化 
	num['A'] = 0;
	num['C'] = 0;
	num['G'] = 0;
	num['T'] = 0;
}

int main() {
	//freopen("in.txt","r",stdin);

	int t;
	scanf("%d",&t);
	while(t--){
		int sum = 0;	//保存总的次数 
		scanf("%d%d",&m,&n);
		for(int i = 0; i < m; i++){
			cin >> str[i];
		}
		
		for(int i = 0; i < n; i++){
			init();
			for(int j = 0; j < m; j++){
				num[str[j][i]]++;
			}
			char tmp;	//该行最多次数的字母
			int ci = 0;
			for(map<char,int>::iterator it = num.begin();it != num.end(); it++){
				if(it->second > ci){
					sum += ci;
					tmp = it->first;
					ci = it->second;
				}else sum += it->second;
			}
			printf("%c",tmp);
		}	
		printf("\n%d\n",sum);
	}
		
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值