洛谷 P3670 [USACO17OPEN]Bovine Genomics S奶牛基因组(银)

题目描述

Farmer John owns NN cows with spots and NN cows without spots. Having just completed a course in bovine genetics, he is convinced that the spots on his cows are caused by mutations in the bovine genome.

At great expense, Farmer John sequences the genomes of his cows. Each genome is a string of length MM built from the four characters A, C, G, and T. When he lines up the genomes of his cows, he gets a table like the following, shown here

for N=3N=3:

Positions: 1 2 3 4 5 6 7 ... M

Spotty Cow 1: A A T C C C A ... T
Spotty Cow 2: G A T T G C A ... A
Spotty Cow 3: G G T C G C A ... A

Plain Cow 1: A C T C C C A ... G
Plain Cow 2: A G T T G C A ... T
Plain Cow 3: A G T T C C A ... T

Looking carefully at this table, he surmises that positions 2 and 4 are sufficient to explain spottiness. That is, by looking at the characters in just these two positions, Farmer John can predict which of his cows are spotty and which are not (for example, if he sees G and C, the cow must be spotty).

Farmer John is convinced that spottiness can be explained not by just one or two positions in the genome, but by looking at a set of three distinct positions. Please help him count the number of sets of three distinct positions that can each explain spottiness.

FJ有n头有斑点的牛和n头没有斑点的牛。由于他刚刚学完牛的基因学的课程,他想知道牛有没有斑点是否

与牛的基因有关。

FJ花了巨大的代价测出了每个牛的基因,每头牛的基因用一个长度为M的由“A,C,G,T”的串构成。FJ将这

些串写成一个表/矩阵,就像图中这样

(N=3的例子)

FJ仔细的观察这个表,他发现通过观测2,4位置的字符串可以预测牛是否有斑点。

(在这个例子中,假如他看到24位置是GC、AT或者AC就可以断定其有斑点,因为1号有斑点的牛24位置基因为AC,2号为AT,3号为GC,而且没有任何一头无斑点的牛的24位置出现过这三个串)

FJ认为,1个或者两个位点是不能够区分品种的,必须是刚好3个位点。他想知道能用多少组三个本质不同的位置判断牛的斑点,{1,2,3}和{1,3,2}是本质相同的

输入输出格式

输入格式:

 

The first line of input contains NN (1 \leq N \leq 5001N500) and MM (3 \leq M \leq 503M50). The next NN lines each contain a string of MMcharacters; these describe the genomes of the spotty cows. The final NN lines describe the genomes of the plain cows.

 

输出格式:

 

Please count the number of sets of three distinct positions that can explain spottiness. A set of three positions explains spottiness if the spottiness trait can be predicted with perfect accuracy among Farmer John's population of cows by looking at just those three locations in the genome.

 

输入输出样例

输入样例#1: 复制
3 8
AATCCCAT
GATTGCAA
GGTCGCAA
ACTCCCAG
ACTCGCAT
ACTTCCAT
输出样例#1: 复制
22

说明

感谢@ 秘密观测者 的提供翻译

思路:枚举

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,ans;
char s[55];
int map[1010][55],tmp[5][5][5];
int work(char c){
    if(c=='A')    return 1;
    if(c=='T')    return 2;
    if(c=='G')    return 3;
    if(c=='C')    return 4;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=2*n;i++){
        scanf("%s",s);
        for(int j=0;j<m;j++)
            map[i][j+1]=work(s[j]);
    }
    for(int i=1;i<=m-2;i++)
        for(int j=i+1;j<=m-1;j++)
            for(int k=j+1;k<=m;k++){
                bool flag=0;
                memset(tmp,0,sizeof(tmp));
                for(int l=1;l<=n;l++)
                    tmp[map[l][i]][map[l][j]][map[l][k]]=1;
                for(int l=n+1;l<=2*n;l++)
                    if(tmp[map[l][i]][map[l][j]][map[l][k]]){ flag=1;break; }
                if(!flag)    ans++;
            }
    cout<<ans;
}

 

posted @ 2017-12-11 22:07  一蓑烟雨任生平  阅读(344)  评论(0编辑  收藏  举报