Simpsons’ Hidden Talents
HDU - 2594
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
code:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 50010;
int Next[MAXN];
char s1[MAXN],s2[MAXN];
void getNext(){
int i = -1,j = 0;
int len = strlen(s1);
memset(Next,0,sizeof(Next));
Next[0] = -1;
while(j < len){
if(i == -1 || s1[i] == s1[j]){
i++,j++;
Next[j] = i;
}
else
i = Next[i];
}
}
int kmp(){
int i = 0,j = 0;
int lens1 = strlen(s1);
int lens2 = strlen(s2);
getNext();
while(j < lens2){
if(i == -1 || s1[i] == s2[j])
i++,j++;
else
i = Next[i];
}
return i;
}
int main(){
while(~scanf("%s%s",s1,s2)){
int n = kmp();
int i;
if(n==0) printf("0\n");
else{
for(i = 0; i < n; i++)
printf("%c",s1[i]);
printf(" %d\n",n);
}
}
return 0;
}