题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594
求a的最长前缀是b的后缀。
将两串拼接成s,a在前b在后,则问题转化为求一个串的前缀是后缀。
注意s的前缀不一定是a的前缀也不一定是b的后缀,所以当f[n]>na或f[n]>nb时我们要忽略子串s[ 1->f[n] ]。
学习:strcat(s1,s2);
strcat 在 #include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std;
char s1[100005],s2[50005];
int next[100005];
void getnext(char *p,int *next){
next[0]=-1;
int i=0,j=-1,len=strlen(p);
while(i<len){
if(j==-1 || p[i]==p[j]){
i++;
j++;
next[i]=j;
}
else{
j=next[j];
}
}
}
int main(){
while(scanf("%s%s",s1,s2)!=EOF){
int len1=strlen(s1),len2=strlen(s2);
strcat(s1,s2);
getnext(s1,next);
int len=strlen(s1);
int j=next[len];
while(j>len1 || j>len2)
j=next[j];
if(j>0){
for(int i=0;i<j;i++)
printf("%c",s1[i]);
printf(" %d\n",j);
}
else
printf("0\n");
}
}