【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 }
原文地址:https://www.cnblogs.com/DrunBee/p/2581146.html