Homer: Marge, I just figured out a way to discover some of the talents we weren’t aware we had.
Marge: Yeah, what is it?
Homer: Take me for example. I want to find out if I have a talent in politics, OK?
Marge: OK.
Homer: So I take some politician’s name, say Clinton, and try to find the length of the longest prefix
in Clinton’s name that is a suffix in my name. That’s how close I am to being a politician like Clinton
Marge: Why on earth choose the longest prefix that is a suffix???
Homer: Well, our talents are deeply hidden within ourselves, Marge.
Marge: So how close are you?
Homer: 0!
Marge: I’m not surprised.
Homer: But you know, you must have some real math talent hidden deep in you.
Marge: How come?
Homer: Riemann and Marjorie gives 3!!!
Marge: Who the heck is Riemann?
Homer: Never mind.
Write a program that, when given strings s1 and s2, finds the longest prefix of s1 that is a suffix of s2.
Marge: Yeah, what is it?
Homer: Take me for example. I want to find out if I have a talent in politics, OK?
Marge: OK.
Homer: So I take some politician’s name, say Clinton, and try to find the length of the longest prefix
in Clinton’s name that is a suffix in my name. That’s how close I am to being a politician like Clinton
Marge: Why on earth choose the longest prefix that is a suffix???
Homer: Well, our talents are deeply hidden within ourselves, Marge.
Marge: So how close are you?
Homer: 0!
Marge: I’m not surprised.
Homer: But you know, you must have some real math talent hidden deep in you.
Marge: How come?
Homer: Riemann and Marjorie gives 3!!!
Marge: Who the heck is Riemann?
Homer: Never mind.
Write a program that, when given strings s1 and s2, finds the longest prefix of s1 that is a suffix of s2.
The lengths of s1 and s2 will be at most 50000.
clinton homer riemann marjorie
0 rie 3
题意概括:找出第一个字符串的前缀和第二个字符串的后缀相同的最大长度。
解题思路:以s2为主串,s1为模式串进行比较,只用 i 控制结束,直到主串比较完为止,此时的j就是我们需要的最大长度。
代码:
#include<stdio.h>
#include<string.h>
#define N 55000
int next[N];
void GetNext(char p[])
{
int l=strlen(p);
int i=0;
int j=-1;
next[0]=-1;
while(i<l)
{
if(j==-1||p[i]==p[j])
{
i++;
j++;
next[i]=j;
}
else
{
j=next[j];
}
}
}
void KMP(char s[],char p[])
{
GetNext(p);
int l1=strlen(s);
int l2=strlen(p);
int i=0;
int j=0;
while(i<l1)
{
if(j==-1||s[i]==p[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(j!=0)
{
for(i=0;i<j;i++)
{
printf("%c",p[i]);
}
printf(" ");
}
printf("%d\n",j);
}
int main()
{
char s[N],p[N];
while(gets(s)!=NULL)
{
gets(p);
KMP(p,s);
}
return 0;
}