zoukankan      html  css  js  c++  java
  • 【POJ】1743 Musical Theme

     1 #include<cstdio>
     2 #include<algorithm>
     3 #define INF 0x7FFFFFFF
     4 #define MAXN 20010
     5 using namespace std;
     6 int a[MAXN];
     7 int wa[MAXN],wb[MAXN],sa[MAXN],wv[MAXN],ws[MAXN];
     8 int height[MAXN],Rank[MAXN];
     9 inline bool cmp(int *r,int a,int b,int len)
    10 {
    11     return r[a]==r[b]&&r[a+len]==r[b+len];
    12 }
    13 void SA(int n,int m)
    14 {
    15     int i,j,p,*x=wa,*y=wb,*t;
    16     for(i=0;i<m;i++)
    17         ws[i]=0;
    18     for(i=0;i<n;i++)
    19         ws[x[i]=a[i]]++;
    20     for(i=1;i<m;i++)
    21         ws[i]+=ws[i-1];
    22     for(i=n-1;i>=0;i--)
    23         sa[--ws[x[i]]]=i;
    24     for(j=p=1;p<n;j<<=1,m=p)
    25     {
    26         for(p=0,i=n-j;i<n;i++)
    27             y[p++]=i;
    28         for(i=0;i<n;i++)
    29         {
    30             if(sa[i]>=j)
    31                 y[p++]=sa[i]-j;
    32         }
    33         for(i=0;i<m;i++)
    34             ws[i]=0;
    35         for(i=0;i<n;i++)
    36             ws[wv[i]=x[y[i]]]++;
    37         for(i=1;i<m;i++)
    38             ws[i]+=ws[i-1];
    39         for(i=n-1;i>=0;i--)
    40             sa[--ws[wv[i]]]=y[i];
    41         for(t=x,x=y,y=t,x[sa[0]]=0,p=i=1;i<n;i++)
    42             x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
    43     }
    44 }
    45 void Height(int n)
    46 {
    47     int i,j,k;
    48     for(i=1;i<=n;i++)
    49         Rank[sa[i]]=i;
    50     for(i=k=0;i<n;height[Rank[i++]]=k)
    51         for(k?k--:0,j=sa[Rank[i]-1];a[i+k]==a[j+k];k++);
    52 }
    53 bool OK(int n,int len)
    54 {
    55     int i,up,down;
    56     up=down=sa[1];
    57     for(i=2;i<=n;i++)
    58     {
    59         if(height[i]<len)
    60             up=down=sa[i];
    61         else
    62         {
    63             up=max(up,sa[i]);
    64             down=min(down,sa[i]);
    65             if(up-down>=len)
    66                 return true;
    67         }
    68     }
    69     return false;
    70 }
    71 int main()
    72 {
    73     int n,i,low,high,mid;
    74     while(scanf("%d",&n),n)
    75     {
    76         for(i=0;i<n;i++)
    77             scanf("%d",&a[i]);
    78         for(i=0;i<n-1;i++)
    79             a[i]=a[i+1]-a[i]+88;
    80         a[n-1]=0;
    81         SA(n,177);
    82         Height(n-1);
    83         for(low=4,high=n>>1|1;low<high;)
    84         {
    85             mid=(low+high)>>1;
    86             if(OK(n,mid))
    87                 low=mid+1;
    88             else
    89                 high=mid;
    90         }
    91         if(low<5)
    92             low=0;
    93         printf("%d\n",low);
    94     }
    95     return 0;
    96 }
    新博客:www.zhixiangli.com
  • 相关阅读:
    【每日日报】第四十六天
    jsp动作标识
    JSP注释
    request对象
    Servlet的创建和配置
    基于图书管理系统的浏览
    在JSP中应用JavaBean
    交流会
    基于图书管理系统的改
    基于图书管理系统的增
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2576660.html
Copyright © 2011-2022 走看看