题意:就是让你求两个字符串的最大子串
#include <bits/stdc++.h> const int maxn=200005; using namespace std; int s[maxn],t1[maxn],t2[maxn],x[maxn],c[maxn],sa[maxn],Rank[maxn],height[maxn]; char str[maxn]; ///sa为后缀数组,记录排序后的后缀数组的位置 ///Rank为记录以i开始的后缀在后缀数组中的位置 ///height为高度数组,表示排序后相邻的两个后缀的公共前缀 void build_sa(int *s,int n,int m) { int i,*x=t1,*y=t2,k; for(i=0; i<m; i++) c[i]=0; for(i=0; i<n; i++) c[x[i]=s[i]]++; for(i=1; i<m; i++) c[i]+=c[i-1]; for(i=n-1; i>=0; i--) sa[--c[x[i]]]=i; for(k=1; k<=n; k<<=1){ int p=0; for(i=n-k; i<n; i++) y[p++]=i; for(i=0; i<n; i++) if(sa[i]>=k) y[p++]=sa[i]-k; for(i=0; i<m; i++) c[i]=0; for(i=0; i<n; i++) c[x[y[i]]]++; for(i=1; i<m; i++) c[i]+=c[i-1]; for(i=n-1; i>=0; i--) sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1; x[sa[0]]=0; for(i=1; i<n; i++) x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++; if(p>=n) break; m=p; } } void getheight(int n) { int i,j,k=0; for(i=0; i<n; i++) Rank[sa[i]]=i; for(i=0; i<n; i++){ if(k) k--; int j=sa[Rank[i]-1]; while(s[i+k]==s[j+k]) k++; height[Rank[i]]=k; } } int main() { int len1,len,i,ans; while(~scanf("%s",str)){ len=strlen(str); len1=len; str[len]='$'; scanf("%s",str+len+1); len=strlen(str); for(i=0; i<len; i++) s[i]=str[i]; build_sa(s,len,130); getheight(len); ans=0; for(i=0; i<len; i++){ if(height[i]>ans&&((sa[i-1]<len1&&sa[i]>=len1)||(sa[i-1]>=len1&&sa[i]<len1))) ans=height[i]; } printf("%d\n",ans); } return 0; }