题意:给你两串字符,要你找出在这两串字符中都出现过的最长子串.........
#include<stdio.h>
#define r 200001
int s[r],a[r],h[r],c[r],e[r],f[r],b[r];
void getsa(int n,int m)
{
int i,j,p;
int *x=e,*y=f,*t;
for(i=0;i<m;i++) b[i]=0;
for(i=0;i<n;i++) b[x[i]=s[i]]++;
for(i=1;i<m;i++) b[i]+=b[i-1];
for(i=n-1;i>=0;i--) a[--b[x[i]]]=i;
for(p=1,j=1;p<n;j*=2,m=p)
{
for(p=0,i=n-j;i<n;i++) y[p++]=i;
for(i=0;i<n;i++) if(a[i]>=j) y[p++]=a[i]-j;
for(i=0;i<n;i++) c[i]=x[y[i]];
for(i=0;i<m;i++) b[i]=0;
for(i=0;i<n;i++) b[c[i]]++;
for(i=1;i<m;i++) b[i]+=b[i-1];
for(i=n-1;i>=0;i--) a[--b[c[i]]]=y[i];
for(p=1,t=x,x=y,y=t,i=1,x[a[0]]=0;i<n;i++)
x[a[i]]=(y[a[i]]==y[a[i-1]]&&y[a[i]+j]==y[a[i-1]+j])?p-1:p++;
}
}
void getheight(int n)
{
int i,j,k=0;
for(i=1;i<=n;i++) b[a[i]]=i;
for(i=0;i<n;i++)
{
if(k) k--;
j=a[b[i]-1];
while(s[i+k]==s[j+k]) k++;
h[b[i]]=k;
}
}
int main()
{
int m,i,j,k=0;
char b[r];
scanf("%s",b);
for(i=j=0;b[i]!='\0';i++)
s[j++]=b[i]-'a'+2;
m=j;
s[j++]=0;
scanf("%s",b);
for(i=0;b[i]!='\0';i++)
s[j++]=b[i]-'a'+2;
s[j++]=1;
getsa(j+1,30);
getheight(j);
for(i=2;i<=j;i++)
{
if(h[i]>k&&((a[i]>m&&a[i-1]<m)||(a[i]<m&&a[i-1]>m)))
k=h[i];
}
printf("%d\n",k);
return 0;
}