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 }