Simpsons’ Hidden Talents
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 833 Accepted Submission(s): 280
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.
#include<stdio.h>
#include<string.h>
#define N 110000
#define MIN(a,b) (a<b?a:b)
char s[N],ss[N];
int next[N];
int p;
void getnext()
{
p=strlen(s);
int i=1,j=0;
next[0]=-1;
next[1]=0;
while(i<=p)
{
if(s[i]==s[j]||j==-1)
next[++i]=++j;
else
j=next[j];
}
}
int main()
{
while(scanf("%s%s",s,ss)!=-1)
{
int n=MIN(strlen(s),strlen(ss));
strcat(s,ss);
getnext();
int i=next[p];
while(i>n&&i>0) //此处不懂;
i=next[i];
s[i]=0;
if(i!=0)
printf("%s %d\n",s,i);
else
printf("%d\n",i);
}
return 0;
}