题意是在所给的两个字符串中找最长的公共前后缀,即第一个字符串前缀和第二个字符串后缀的最长相等串。
思路是将两个字符串拼接在一起,然后直接套用 kmp 算法即可。
要注意用 next 会报编译错误,改成 Next 才过……但 next 确实不是 c++ 关键字。
代码如下:
1 #include <iostream>
2 #include <cstring>
3 #include <cstdio>
4 using namespace std;
5 const int N=50000+5;
6 char a[N*2],b[N];
7 int Next[N*2];
8 void getNext()
9 {
10 Next[0] = -1;
11 int i=1,j=0,len=strlen(a);
12 while(i<len)
13 {
14 if(j==-1||a[i]==a[j])
15 {
16 i++;j++;
17 Next[i]=j;
18 }
19 else
20 j=Next[j];
21 }
22 }
23 int main()
24 {
25 while(~scanf("%s%s",a,b))
26 {
27 int lena=strlen(a),lenb=strlen(b);
28 strcat(a,b);//将b字符串连在a字符串后
29 getNext();//求解Next数组
30 int ans=Next[strlen(a)];
31 while(ans>lenb||ans>lena) ans=Next[ans];
32 if(ans==0) puts("0");
33 else
34 {
35 a[ans] = 0;
36 printf("%s %d\n",a,ans);
37 }
38 }
39 return 0;
40 }
View Code