题意大概就是输入串s1和s2,问s1的前缀和s1的后缀的公告部分最长是哪个子串
思路:可以把两个串连成一个串,然后利用Kmp算法的next数组求出最长的相匹配的前缀和后缀就行了。
#include<stdio.h>
#include<string.h>
char a[50010];
char b[100010];
int next[100010];
int m,n;
void GetNext() //求next数组
{
next[1]=0;
int i,j=0;
for(i=2;i<=m;i++){
while(j>0&&b[j+1]!=b[i]) j=next[j];
if(b[j+1]==b[i]) j+=1;
next[i]=j;
}
}
int main(){
while(scanf("%s%s",b+1,a+1)!=EOF){
int len=strlen(b+1);
int len1=strlen(a+1);
strcat(b+1,a+1); //将两个字符串拼接
m=strlen(b+1);
GetNext();
int tmp=m;
//获得最长匹配的前缀和后缀
while(next[tmp]>len) tmp=next[tmp];
while(next[tmp]>len1) tmp=next[tmp];
if(next[tmp]!=0){
for(int i=1; i <= next[tmp]; i++)
printf("%c",b[i]);
printf(" %d\n",next[tmp]);
}
else printf("0\n");
}
}