Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15853 Accepted Submission(s): 5403 Problem Description Homer: Marge, I just figured out a way to discover some of the talents we weren’t aware we had.
Input Input consists of two lines. The first line contains s1 and the second line contains s2. You may assume all letters are in lowercase.
Output Output consists of a single line that contains the longest string that is a prefix of s1 and a suffix of s2, followed by the length of that prefix. If the longest such string is the empty string, then the output should be 0.
Sample Input clinton homer riemann marjorie
Sample Output 0 rie 3
Source HDU 2010-05 Programming Contest
Recommend lcy
|
题目大意:现在给你两个字符串然后问你这两个字符串的前缀和后缀的相同的数目是多少
思路:其实看到这个前缀后缀就可以想到我们的KMP算法中的next数组了,然后如果直接相加的话是错误的,因为可能你加上的后面的数组后变成了一个前缀后缀特别大的字符串了,为了防止前面字符串的尾巴和下面的有一些别的‘反应’,我们知道加上那个干扰字符串就好了,我的话是加上了两个,貌似这个题目加上一个也行,但是总觉得怪怪的。。。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<string>
using namespace std;
const int maxn=50000*2+5;
int nxt[maxn];
void getnext(char p[])
{
nxt[0]=-1;
int j=0,k=-1;
int len=strlen(p);
while(j<len)
{
if(k==-1||p[j]==p[k])
nxt[++j]=++k;
else
k=nxt[k];
}
}
char s1[maxn],s2[maxn];
int main()
{
while(~scanf("%s %s",&s1,&s2))
{
int m=strlen(s1);
char str[]={'#','$'};
strcat(s1,str);
//cout<<s1<<endl;
strcat(s1,s2);
getnext(s1);
int len=strlen(s1);
if(nxt[len]==0)
cout<<0<<endl;
else
{
for(int i=0;i<nxt[len];i++)
cout<<s1[i];
cout<<" "<<nxt[len]<<endl;
}
}
}