• 【SPOJ】687 Repeats


      1 #include<cstdio>
      2 #include<algorithm>
      3 using namespace std;
      4 #define MAXN 50010
      5 #define MAXM 20
      6 char s[MAXN];
      7 int wa[MAXN],wb[MAXN],wv[MAXN],ws[MAXN];
      8 int sa[MAXN],height[MAXN],rk[MAXN];
      9 int st[MAXM][MAXN],log2[MAXN];
     10 inline bool cmp(int *r,int a,int b,int len)
     11 {
     12     return r[a]==r[b]&&r[a+len]==r[b+len];
     13 }
     14 void SA(int n,int m)
     15 {
     16     int i,j,p,*x=wa,*y=wb,*t;
     17     for(i=0;i<m;i++)
     18         ws[i]=0;
     19     for(i=0;i<n;i++)
     20         ws[x[i]=s[i]]++;
     21     for(i=1;i<m;i++)
     22         ws[i]+=ws[i-1];
     23     for(i=n-1;i>=0;i--)
     24         sa[--ws[x[i]]]=i;
     25     for(j=p=1;p<n;j<<=1,m=p)
     26     {
     27         for(p=0,i=n-j;i<n;i++)
     28             y[p++]=i;
     29         for(i=0;i<n;i++)
     30         {
     31             if(sa[i]>=j)
     32                 y[p++]=sa[i]-j;
     33         }
     34         for(i=0;i<m;i++)
     35             ws[i]=0;
     36         for(i=0;i<n;i++)
     37             ws[wv[i]=x[y[i]]]++;
     38         for(i=1;i<m;i++)
     39             ws[i]+=ws[i-1];
     40         for(i=n-1;i>=0;i--)
     41             sa[--ws[wv[i]]]=y[i];
     42         for(t=x,x=y,y=t,x[sa[0]]=0,p=i=1;i<n;i++)
     43             x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
     44     }
     45 }
     46 void Height(int n)
     47 {
     48     int i,j,k;
     49     for(i=1;i<=n;i++)
     50         rk[sa[i]]=i;
     51     for(i=k=0;i<n;height[rk[i++]]=k)
     52         for(k?k--:0,j=sa[rk[i]-1];s[i+k]==s[j+k];k++);
     53 }
     54 void Init()
     55 {
     56     int i,k;
     57     log2[1]=0;
     58     for(i=k=2;i<MAXN;i++)
     59     {
     60         if(i>=(1<<k))
     61             k++;
     62         log2[i]=k-1;
     63     }
     64 }
     65 void ST(int n)
     66 {
     67     int i,j;
     68     for(i=1;i<=n;i++)
     69         st[0][i]=height[i];
     70     for(j=1;(1<<j)<=n;j++)
     71     {
     72         for(i=1;i+(1<<j)<=n+1;i++)
     73             st[j][i]=min(st[j-1][i],st[j-1][i+(1<<(j-1))]);
     74     }
     75 }
     76 int RMQ(int i,int j)
     77 {
     78     i=rk[i];
     79     j=rk[j];
     80     if(i>j)
     81         swap(i,j);
     82     i++;
     83     int k=log2[j-i+1];
     84     return min(st[k][i],st[k][j-(1<<k)+1]);
     85 }
     86 int main()
     87 {
     88     int c,i,len,k,res,ans,n,pos;
     89     Init();
     90     scanf("%d",&c);
     91     while(c--)
     92     {
     93         scanf("%d",&n);
     94         for(i=0;i<n;i++)
     95             scanf(" %c",&s[i]);
     96         s[i]=0;
     97         SA(n+1,'z'+1);
     98         Height(n);
     99         ST(n);
    100         ans=0;
    101         for(len=1;len<=n>>1;len++)
    102         {
    103             for(i=0;i+len<n;i+=len)
    104             {
    105                 k=RMQ(i,i+len);
    106                 if(k)
    107                 {
    108                     res=k/len;
    109                     pos=i-(len-k%len);
    110                     if(pos>=0&&RMQ(pos,pos+len)>=len)
    111                         res++;
    112                     if(res>ans)
    113                         ans=res;
    114                 }
    115             }
    116         }
    117         printf("%d\n",ans+1);
    118     }
    119     return 0;
    120 }
  • 相关阅读:
    idea中如何配置tomcat
    onselectstart属性解决双击出现的蓝色区域
    (二十二)数组的最大值和最小值
    (二十一)数组的初始化
    (二十)两种数据类型的对比
    (十九)数组的内存分配
    (十八)数组概述
    (十六)函数的重载
    (十七)自定义函数
    (十五)函数的入栈和出栈
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2581146.html
Copyright © 2020-2023  润新知