LA_3602DNA Consensus String ( hash, 貪心 )
来源:互联网 发布:淘宝上的谭光树蜂蜜 编辑:程序博客网 时间:2024/05/20 20:21
題意:給定m個長度爲n的DNA序列,求一個DNA序列到所有DNA序列的Hamming距離最小,兩個字符串的Hamming距離定義爲:字符不同的位置數分析:統計每一列的ACGT的數量,取最多的爲rst,然後統計Hamming距離Code:#include <set>#include <map>#include <cmath>#include <ctime>#include <stack>#include <queue>#include <deque>#include <vector>#include <cstdio>#include <bitset>#include <cstdlib>#include <cstring>#include <algorithm>using namespace std;#define DIR 4#define DIM 2#define STATUS 2#define MAXCNT 50 + 10#define MAXN 1000 + 10#define oo (~0u)>>1#define INF 0x3F3F3F3F#define REPI(i, s, e) for(int i = s; i <= e; i ++)#define REPD(i, e, s) for(int i = e; i >= s; i --)static const double EPS = 1e-5;int hash[MAXCNT];char str[MAXCNT][MAXN], rst[MAXN];int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGE freopen("test.in", "r", stdin);#endif int n, len, cas; scanf("%d", &cas); REPI(k, 1, cas) { scanf("%d %d", &n, &len); REPI(i, 0, n-1) { scanf("%s", str[i]); } int ans = 0; REPI(c, 0, len-1) { hash['A'-'A'] = hash['C'-'A'] = 0; hash['T'-'A'] = hash['G'-'A'] = 0; REPI(r, 0, n-1) { hash[str[r][c]-'A'] += 1; } char ch = 'A'; int max_val = hash['A'-'A'], sum = 0; sum += hash['A'-'A']; sum += hash['C'-'A']; sum += hash['G'-'A']; sum += hash['T'-'A']; if( max_val < hash['C'-'A'] ) { max_val = hash['C'-'A'], ch = 'C'; } if( max_val < hash['G'-'A'] ) { max_val = hash['G'-'A'], ch = 'G'; } if( max_val < hash['T'-'A'] ) { max_val = hash['T'-'A'], ch = 'T'; } rst[c] = ch, ans += sum-hash[ch-'A']; } REPI(i, 0, len-1) { printf("%c", rst[i]); } printf("\n%d\n", ans); } return 0;}