不能循环输入。。。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=200000+10; 6 char s[maxn]; 7 int sa[maxn],t[maxn],t2[maxn],c[maxn]; 8 int rank[maxn],height[maxn]; 9 void build_sa(int n,int m) 10 { 11 int i,*x=t,*y=t2; 12 for(i=0;i<m;i++) c[i]=0; 13 for(i=0;i<n;i++) c[x[i]=s[i]]++; 14 for(i=1;i<m;i++) c[i]+=c[i-1]; 15 for(i=n-1;i>=0;i--) sa[--c[x[i]]]=i; 16 17 for(int k=1;k<=n;k<<=1) 18 { 19 int p=0; 20 for(i=n-k;i<n;i++) y[p++]=i; 21 for(i=0;i<n;i++) if(sa[i]>=k) y[p++]=sa[i]-k; 22 23 for(i=0;i<m;i++) c[i]=0; 24 for(i=0;i<n;i++) c[x[y[i]]]++; 25 for(i=1;i<m;i++) c[i]+=c[i-1]; 26 for(i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i]; 27 swap(x,y); 28 p=1;x[sa[0]]=0; 29 for(i=1;i<n;i++) 30 x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++; 31 if(p>=n) break; 32 m=p; 33 } 34 } 35 void getHeight(int n) 36 { 37 int i,k=0; 38 for(i=1;i<=n;i++) rank[sa[i]]=i; 39 for(i=0;i<n;i++) 40 { 41 if(k) k--; 42 int j=sa[rank[i]-1]; 43 while(s[i+k]==s[j+k]) k++; 44 height[rank[i]]=k; 45 } 46 } 47 int solve(int n,int lena) 48 { 49 int ans=0; 50 for(int i=1;i<=n;i++) 51 { 52 if(height[i]>ans) 53 if(sa[i]<lena&&sa[i-1]>lena||sa[i]>lena&&sa[i-1]<lena) 54 ans=height[i]; 55 } 56 return ans; 57 } 58 int main() 59 { 60 gets(s); 61 int lena=strlen(s); 62 s[lena]='$'; 63 gets(s+lena+1); 64 int n=strlen(s); 65 build_sa(n+1,128); 66 getHeight(n); 67 printf("%d ",solve(n,lena)); 68 return 0; 69 }