#include <stdio.h>
#include <string.h>
#define min(a,b) ((a)<(b)?(a):(b))
/*
clinton
homer
riemann
marjorie
题意: 前缀和后缀 的最长匹配
思路:KMP ,将前一个串和后一个串链接起来,求next[n]就是答案
*/
const int N = 50005;
char a[N],b[N],c[2*N];
int next[2*N];//注意
int lena,lenb,lenc;
void getNext()
{
int j=-1;next[0]=-1;
for(int i=1;i<lenc;i++)
{
while(j>=0 && c[i]!=c[j+1])
j=next[j];
if(c[i]==c[j+1])
j++;
next[i]=j;
}/*
for(int i=0;i<lenc;i++)
printf("%d ",next[i]);
printf("\n");*/
}
int main()
{
while(~scanf("%s%s",a,b))
{
lena=strlen(a);lenb=strlen(b);
strcpy(c,a);strcpy(c+lena,b);
lenc=strlen(c);
getNext();
int k=next[lenc-1]+1;
//坑点: 串可能一直匹配下去
int ans=min(min(lena,lenb),k);
if(ans==0)
printf("0\n");
else
{
for(int i=0;i<ans;i++)
printf("%c",a[i]);
printf(" %d\n",ans);
}
}
return 0;
}
字符串 KMP HDU 2594
最新推荐文章于 2021-08-26 20:34:43 发布