2016 第七届 蓝桥杯 国赛 碱基

来源:互联网 发布:虚拟机下安装linux 编辑:程序博客网 时间:2024/06/05 19:36

碱基

生物学家正在对n个物种进行研究。
其中第i个物种的DNA序列为s[i],其中的第j个碱基为s[i][j],碱基一定是A、T、G、C之一。
生物学家想找到这些生物中一部分生物的一些共性,他们现在关注那些至少在m个生物中出现的长度为k的连续碱基序列。准确的说,科学家关心的序列用2m元组(i1,p1,i2,p2….im,pm)表示,
满足:
1<=i1

package lq.lq2016;import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.Map.Entry;import java.util.Scanner;public class BasicGroup2 {   static int n,m,k,ans=0;   static int mod=1000000007;   static String[]S,num;   static int[] start;   static HashMap<String,Integer> mp = new HashMap<String,Integer>();   static HashSet<String> result = new HashSet<String>();   static void dfs(int ind ){       if(ind==n){           ArrayList<String> set = new ArrayList<String>();           StringBuffer[] s = new StringBuffer[n];           for(int i = 0;i < n;i++)               s[i] = new StringBuffer("");           for(int i = 0;i < n;i++) {               if(!num[i].equals("")) {                   if(!set.contains(num[i])) {                       set.add(num[i]);                       s[set.size() - 1].append(i);                       s[set.size() - 1].append(start[i]);                   } else {                       int j = set.indexOf(num[i]);                       s[j].append(i);                       s[j].append(start[i]);                   }               }           }           for(int i = 0;i < n;i++) {               if(s[i].toString().length() == m * 2) {                   if(!result.contains(s[i].toString())){                       ans = (ans + 1) % mod;                       result.add(s[i].toString());                   }               }           }           return;       }       String str=S[ind];       num[ind]="";       dfs(ind+1);       for(int i=0;(i+k)<=str.length();i++){           String tmp=str.substring(i,i+k);           num[ind]=tmp;           start[ind] = i;           dfs(ind+1);       }   }   public static void main(String[] args) {    Scanner in =new Scanner(System.in);     n = in.nextInt();     m = in.nextInt();     k = in.nextInt();     S = new String[n];     start=new int[n];     for(int i = 0;i < n;i++)         S[i] = in.next();     num=new String[n];    dfs(0);    System.out.println(ans);}}
原创粉丝点击