题意:给出两个字符串S1,S2.求S1的前缀与S2的后缀的公共长度。
例 S1=riemann,S2=marjorier的公共长度为3,
解法:直接用暴力的KMP即可。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<string>
#include<vector>
#include<cmath>
#include<map>
using namespace std;
const int N=50001;
char s1[N],s2[N];
int next[N];
int len1,len2;
void get_next()
{
int i=0,j=-1;
next[0]=-1;
while (i<len1)
{
//cout<<i<<endl;
if (j==-1 || s1[j]==s1[i])
{
i++;
j++;
//next[i]=j;
if (s1[i]!=s1[j]) next[i]=j;
else next[i]=next[j];
}
else j=next[j];
}
}
void put()
{
int i=0,j=0; //这里的j为0开始,不是-1。
while (i<len2)
{
if (j==-1 || s2[i]==s1[j])
{
i++;
j++;
}
else j=next[j];
}
if (j<=0) puts("0");
else printf("%s %d\n",s2+len2-j,j);
}
int main()
{
freopen("in","r",stdin);
while (scanf("%s%s",s1,s2)!=EOF)
{
//cout<<s1<<' '<<s2<<endl;
len1=strlen(s1);
len2=strlen(s2);
get_next();
put();
//for (int i=0;i<len1+1;i++) cout<<next[i]<<' ';cout<<endl;
}
}