1. 程式人生 > >洛谷 P3670 [USACO17OPEN]Bovine Genomics S奶牛基因組(銀)

洛谷 P3670 [USACO17OPEN]Bovine Genomics S奶牛基因組(銀)

通過 har ber ostream owin otto rst inpu pen

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;
}

洛谷 P3670 [USACO17OPEN]Bovine Genomics S奶牛基因組(銀)