最长公共字串,给定两个串,其最长公共字串,后缀数组的简单应用。字符串的任意一个字串都是这个字符串的某个后缀的前缀。求A和B的最长公共字串定价于求A的后缀和B的后缀的最长公共前缀的最大值,所以可以将两个串连起来,中间用一个没出现过的字符隔开。这样就转换成了求最长可重叠重复字串的问题了,它就等于最大的Height值,因为任意两个后缀的最长公共前缀都是height数组中某一段中的最小值,那么这个值一定不大于height数组中的最大值。但这样还不行,如果你所求的两个串只在一个串中明显是不行的,所以还要加一个限制条件他们属于不同的串,只需suff[i-1]和suff[i]不同时在A或B中即可。
附部分代码:
bool Judge(int c)
{
if(suff[c]>=len1&&suff[c-1]>=len1)
return false;
else if(suff[c]<len1&&suff[c-1]<len1)
return false;
else
return true;
}
int main()
{
scanf("%s",str);
len1=strlen(str);
str[len1]=1; //觉得中间不加字符,也应该是对的,但这样Runtime Error,还没想清楚
scanf("%s",str+len1);
len=strlen(str);
printf("%s %d",str,len);
for(int i=0;i<len;i++)
r[i]=str[i];
CreatSuff(150);
CalHeight();
int Max=0;
for(int i=1;i<len;i++)
if(Max<H[i]&&Judge(i))
Max=H[i];
printf("%d/n",Max);
return 0;
}