zoukankan      html  css  js  c++  java
  • 【UVa】760 DNA Sequencing

      1 #include<cstdio>
      2 #include<cstring>
      3 #define MAXN 660
      4 char s[MAXN];
      5 int wa[MAXN],wb[MAXN],wv[MAXN],ws[MAXN];
      6 int sa[MAXN],height[MAXN],rk[MAXN];
      7 inline bool cmp(int *r,int a,int b,int L)
      8 {
      9     return r[a]==r[b]&&r[a+L]==r[b+L];
     10 }
     11 void SA(int n,int m)
     12 {
     13     int i,j,p,*x=wa,*y=wb,*t;
     14     for(i=0;i<m;i++)
     15         ws[i]=0;
     16     for(i=0;i<n;i++)
     17         ws[x[i]=s[i]]++;
     18     for(i=1;i<m;i++)
     19         ws[i]+=ws[i-1];
     20     for(i=n-1;i>=0;i--)
     21         sa[--ws[x[i]]]=i;
     22     for(j=p=1;p<n;j<<=1,m=p)
     23     {
     24         for(p=0,i=n-j;i<n;i++)
     25             y[p++]=i;
     26         for(i=0;i<n;i++)
     27         {
     28             if(sa[i]>=j)
     29                 y[p++]=sa[i]-j;
     30         }
     31         for(i=0;i<m;i++)
     32             ws[i]=0;
     33         for(i=0;i<n;i++)
     34             ws[wv[i]=x[y[i]]]++;
     35         for(i=1;i<m;i++)
     36             ws[i]+=ws[i-1];
     37         for(i=n-1;i>=0;i--)
     38             sa[--ws[wv[i]]]=y[i];
     39         for(t=x,x=y,y=t,x[sa[0]]=0,p=i=1;i<n;i++)
     40             x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
     41     }
     42 }
     43 void Height(int n)
     44 {
     45     int i,j,k;
     46     for(i=1;i<=n;i++)
     47         rk[sa[i]]=i;
     48     for(i=k=0;i<n;height[rk[i++]]=k)
     49         for(k?k--:0,j=sa[rk[i]-1];s[i+k]==s[j+k];k++);
     50 }
     51 bool OK(int n,int len,int mid)
     52 {
     53     int i,j;
     54     for(i=1;i<=n;i++)
     55     {
     56         if(height[i]>=mid)
     57         {
     58             for(j=i;j<=n&&height[j]>=mid;j++)
     59             {
     60                 if(sa[j-1]<len&&sa[j]>len||sa[j-1]>len&&sa[j]<len)
     61                     return true;
     62             }
     63             i=j-1;
     64         }
     65     }
     66     return false;
     67 }
     68 int main()
     69 {
     70     int n,len,low,high,mid,i,j,k;
     71     bool first=true;
     72     while(~scanf(" %s",s))
     73     {
     74         if(first)
     75             first=false;
     76         else
     77             putchar('\n');
     78         len=strlen(s);
     79         s[len]='#';
     80         scanf(" %s",s+len+1);
     81         n=strlen(s);
     82         SA(n+1,'z'+1);
     83         Height(n);
     84         for(low=0,high=n;low<high;)
     85         {
     86             mid=(low+high)>>1;
     87             if(OK(n,len,mid))
     88                 low=mid+1;
     89             else
     90                 high=mid;
     91         }
     92         low--;
     93         if(low)
     94         {
     95             for(i=1;i<=n;i++)
     96             {
     97                 if(height[i]>=low)
     98                 {
     99                     for(j=i;j<=n&&height[j]>=low;j++);
    100                     for(k=i;k<j;k++)
    101                     {
    102                         if(sa[k-1]<len&&sa[k]>len||sa[k-1]>len&&sa[k]<len)
    103                             break;
    104                     }
    105                     if(k!=j)
    106                     {
    107                         for(k=sa[i];k<sa[i]+low;k++)
    108                             putchar(s[k]);
    109                         putchar('\n');
    110                     }
    111                     i=j-1;
    112                 }
    113             }
    114         }
    115         else
    116             puts("No common sequence.");
    117     }
    118     return 0;
    119 }
  • 相关阅读:
    40+精彩的HTML5实例和教程
    10+不错的设计资源和灵感的网站
    js利用点击事件做一个简单的计算器
    如何在canvas中画出一个太极图
    利用canvas画一个实时时钟
    利用随机数与定时器做一个简单的伪随机抓阄游戏
    IE8模对话框无法返回至主页面的解决方法
    C# String.Format字符串中包含"{" "}"时需注意的问题
    [Struts2应用开发] 统一的登录验证
    Visual Studio 2008 Express中文版 ‘加载此属性页是出错’ 解决方法
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2586005.html
Copyright © 2011-2022 走看看