题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594
解题思路:
两个字符串拼接起来,求 小于等于拼接前较小单个字符串长度 的 最长相同前后缀
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5+5;
char s[N];
int fail[N];
void kmp(int len,int lenn)
{
fail[0] = -1;
for (int i=0,j=-1;i<len+lenn;){
if (j==-1||s[i]==s[j]){
i++;
j++;
fail[i] = j;
}
else j = fail[j];
}
int now = len+lenn;
while (fail[now]>min(len,lenn)) now = fail[now];
int maxx = fail[now];
for (int i=0;i<maxx;i++)
printf("%c",s[i]);
if (maxx!=0) printf(" ");
printf("%d\n",maxx);
}
int main()
{
while (~scanf("%s",s)){
int len = strlen(s);
scanf("%s",s+len);
int lenn = strlen(s+len);
if (len==0 || lenn==0){
puts("0");
continue;
}
kmp(len,lenn);
}
return 0;
}
下面是第一次的代码
只注意 “111” + “11111”这种情况
今天刷其他题WA的时候找出了 aaba abaa这组数据
错误错误错误代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5+5;
char s[N];
int fail[N];
void kmp(int len,int lenn)
{
fail[0] = -1;
for (int i=0,j=-1;i<len+lenn;){
if (j==-1||s[i]==s[j]){
i++;
j++;
fail[i] = j;
}
else j = fail[j];
}
int maxx = min(min(len,lenn),fail[len+lenn]);
for (int i=0;i<maxx;i++)
printf("%c",s[i]);
if (maxx!=0) printf(" ");
printf("%d\n",maxx);
}
int main()
{
while (~scanf("%s",s)){
int len = strlen(s);
scanf("%s",s+len);
int lenn = strlen(s+len);
if (len==0 || lenn==0){
puts("0");
continue;
}
kmp(len,lenn);
}
return 0;
}