Simpsons’ Hidden Talents
Total Submission(s): 5061 Accepted Submission(s): 1845
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.
題意是求最長主串的前綴與模式串後綴匹配。
這種,只要連接後,便可利用KMP的功能,來實現找到其前綴後綴的最大匹配。
注意中間需要一個不會出現的字符進行隔開,以防出現自我匹配的情況。
代碼如下;
/*************************************************************************
> File Name: Simpsons_Hidden_Talents.cpp
> Author: Zhanghaoran
> Mail: [email protected]
> Created Time: Wed 02 Dec 2015 05:14:12 PM CST
************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
void preKMP(char x[], int m, int kmpnext[]){
int i, j;
i = 0;
j = kmpnext[0] = -1;
while(i < m){
while(j != -1 && x[i] != x[j])
j = kmpnext[j];
if(x[++ i] == x[++ j])
kmpnext[i] = kmpnext[j];
else
kmpnext[i] = j;
}
}
int nexti[100010];
int main(void){
char str1[100010];
char str2[50010];
while(~(scanf("%s%s", str1, str2))){
int temp1 = strlen(str1);
str1[temp1] = '&';
str1[temp1 + 1] = '\0';
strcat(str1, str2);
int temp = strlen(str1);
preKMP(str1, temp, nexti);
if(nexti[temp]){
for(int i = 0; i < nexti[temp]; i ++){
printf("%c", str1[i]);
}
cout << " ";
cout << nexti[temp] << endl;
}
else
cout << nexti[temp] << endl;
}
}