【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 }

你可能感兴趣的:(poj)