题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594
题目大意:给两串字符串s1,s2,,找到最长子串满足既是s1的前缀又是s2的后缀,输出子串,及相应长度。
解题思路:这题是不是跟POJ 2752很像,没错,我们只要将s1、s2合并,不断递归直到找到长度小于等于s1、s2的公共前后缀即可。
代码
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 const int N=1e6+5; 8 9 int nxt[N]; 10 char s1[N],s2[N]; 11 12 void getnext(char *p,int m){ 13 int i,j; 14 i=0,j=nxt[0]=-1; 15 while(i<m){ 16 while(j!=-1&&p[i]!=p[j]) 17 j=nxt[j]; 18 nxt[++i]=++j; 19 } 20 } 21 22 int main(){ 23 while(~scanf("%s",s1)){ 24 scanf("%s",s2); 25 int m=strlen(s1),n=strlen(s2); 26 int cnt=m; 27 //合并s1,s2求nxt数组 28 for(int i=0;i<n;i++){ 29 s1[cnt++]=s2[i]; 30 } 31 s1[cnt]='