2016 第七届 蓝桥杯 国赛 碱基

碱基

生物学家正在对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 mp = new HashMap();
   static HashSet result = new HashSet();


   static void dfs(int ind ){
       if(ind==n){

           ArrayList set = new ArrayList();
           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);
}
}

你可能感兴趣的:(乱搞)