题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594
代码如下:
#include<cstdio>
#include<iostream>
#define N 50005
#include<cstring>
using namespace std;
char s[N],s1[N];
int len,ne[N],len1;
void get_next() {
int i=0,j=-1;
ne[0]=-1;
while(i<len) {
if(j==-1||s[i]==s[j]) {
i++;
j++;
if(s[i]==s[j])
ne[i]=ne[j];
else
ne[i]=j;
} else
j=ne[j];
}
}
int KMP() {//返回s串的前缀和s1 串的后缀匹配的最长长度
int i,j;
for(i=j=0; i<len1;) {
if(s1[i]==s[j]) {
i++;
j++;
} else {
j=ne[j];
if(j==-1) {
j=0;
i++;
}
}
}
return j;
}
int main() {
while(~scanf("%s%s",s,s1)) {
int ans;
len=strlen(s);
get_next();
len1=strlen(s1);
ans=KMP();
if(!ans)
printf("0\n");
else
printf("%s %d\n",s1+len1-ans,ans);
}
}