Bovine Genomics - UPCOJ 3451 - 简单哈希 + 暴力

140 篇文章 0 订阅
91 篇文章 0 订阅

题目:

题目描述
Farmer John owns N cows with spots and N 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 M 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=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.

输入
The first line of input contains N (1≤N≤500) and M (3≤M≤50). The next N lines each contain a string of M characters; these describe the genomes of the spotty cows. The final N 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.

样例输入

3 8
AATCCCAT
GATTGCAA
GGTCGCAA
ACTCCCAG
ACTCGCAT
ACTTCCAT

样例输出

22

题意:

  给你2n个字符串,问你在编号1到n的字串里,哪三个位置的字母所构成的n个字符串和编号为n+1到2n里对应位置所构成的n个字符串没有交集。


思路:

  数据范围比较小,直接m三次穷举所有可能的情况然后对每种情况进行比较,比较的时候可以通过判断string是否相等,也可以简单哈希之后通过数组来判断是否有重复。


实现:

#include <bits/stdc++.h>
using namespace std;
#define maxn 507
int s[maxn][57],p[maxn][57],tmphash;
char tmp;
bool ha_sh[207];
int main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
#endif
    ios_base::sync_with_stdio(false);cin.tie(0);
    int n,m,result;
    while(result=0, cin >> n >> m) {
        for(int i=0 ; i<n ; i++) {
            for(int j=0 ; j<m ; j++) {
                cin >> tmp;
                if(tmp == 'A') s[i][j] = 1;
                else if(tmp == 'C') s[i][j] = 2;
                else if(tmp == 'G') s[i][j] = 3;
                else if(tmp == 'T') s[i][j] = 4;
            }
        }
        for(int i=0 ; i<n ; i++) {
            for(int j=0 ; j<m ; j++) {
                cin >> tmp;
                if(tmp == 'A') p[i][j] = 1;
                else if(tmp == 'C') p[i][j] = 2;
                else if(tmp == 'G') p[i][j] = 3;
                else if(tmp == 'T') p[i][j] = 4;
            }
        }
        for(int i=0 ; i<m; i++) {
            for(int j=i+1 ; j<m ; j++) {
                for(int k=j+1 ; k<m ; k++) {
                    bool flag = true;
                    memset(ha_sh,0,sizeof ha_sh);
                    for(int t=0 ; t<n ; t++) {
                        ha_sh[s[t][i]*11+s[t][j]*27+s[t][k]] = true;
                    }
                    for(int t=0 ; t<n ; t++) {
                        if(ha_sh[p[t][i]*11+p[t][j]*27+p[t][k]]) {
                            flag = false;
                            break;
                        }
                    }
                    if(flag) result++;
                }
            }
        }
        cout << result << '\n';
    }
    return 0;
}

其他:

  在这里我哈希的时候基数选择错误造成哈希值不唯一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值