#include <cstdio>#include<algorithm>#include<cstring>#defineN 200005using namespacestd;intBuf1[n],buf2[n],sa[n],rnk[n],buc[n],n,height[n],ans,belong[n];CharS[n];voidSuffix_sort () {int*x=buf1,*y=buf2,m= +; for(intI=0; i<m;i++) buc[i]=0; for(intI=1; i<=n;i++) buc[x[i]=s[i]]++; for(intI=1; i<=m;i++) buc[i]+=buc[i-1]; for(inti=n;i;i--) sa[buc[x[i]]--]=i; for(intk=1; k<=n;k<<=1) { intp=0; for(inti=n-k+1; i<=n;i++) y[++p]=i; for(intI=1; i<=n;i++) if(sa[i]>k) y[++p]=sa[i]-K; for(intI=0; i<=m;i++) buc[i]=0; for(intI=1; i<=n;i++) buc[x[y[i]]]++; for(intI=1; i<=m;i++) buc[i]+=buc[i-1]; for(inti=n;i;i--) sa[buc[x[y[i]]]--]=Y[i]; Swap (x, y), x[sa[1]]=p=1; for(intI=2; i<=n;i++) if(y[sa[i-1]]==y[sa[i]] && y[sa[i-1]+k]== y[sa[i]+K]) X[sa[i]]=p; Elsex[sa[i]]=++p; if((m=p) >=n) Break; } for(intI=1; i<=n;i++) Rnk[sa[i]]=i; for(intI=1, j,k=0; i<=n;i++) { if(rnk[i]==1)Continue; if(k) k--; J=sa[rnk[i]-1]; while(S[i+k]==s[j+k] && i+k<=n && j+k<=n) k++; Height[rnk[i]]=K; } }intMain () {scanf ("%s", s+1); N=strlen (s+1); for(intI=1; i<=n;i++) Belong[i]=2; S[n+1]='#'; scanf ("%s", s+n+2); N=strlen (s+1); for(intI=1; i<=n;i++) if(--belong[i]==-1) belong[i]=2; Suffix_sort (); for(intI=2; i<=n;i++) if(belong[sa[i]]!=belong[sa[i-1]]) ans=Max (ans,height[i]); printf ("%d\n", ans); return 0;}
POJ 2774 to find the longest common prefix for two strings | suffix array