题目的意思是有两个字符串a,b。 a的最大前缀和b的最大后缀相同几个。 刚开始看题目以为只要先把两个字符串连接一下,然后next数组修改一下就可以后来发现并不对,因为有可能前缀会包含到另一个字符串中。所以只要把第二个字符串当作原串,第一个当作模式串,通过kmp找相同的就可以了。
(不要嘲笑我代码写的难看)!!!!
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <cmath>
#include <set>
#include <climits>
#define INF 0x7fffffff
#define finc(i,a,b) for(i=a;i<=b;i++)
#define fdec(i,a,b) for(i=a;i>=b;i--)
using namespace std;
char s[60000],p[60000];
int next[60000];
void getnext(char *p,int *next)
{
int i=0,j=-1;
next[0]=-1;
int c=strlen(p);
while(i<c)
{
if(j==-1||p[i]==p[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int kmp(char *s,char *p)
{
int i=0,j=0;
getnext(p,next);
int c=strlen(s);
int m=strlen(p);
while(i<c)
{
if(j==-1||s[i]==p[j])
{
i++;
j++;
}
else
j=next[j];
}
if(i==c&&j>0)
{
return j;
}
else
return -1;
}
int main()
{
int i,j;
while(~scanf("%s",s))
{
scanf("%s",p);
int n=kmp(p,s);
if(n==-1)
printf("0\n");
else
{
for(i=0;i<n;i++)
{
if(i==n-1)
printf("%c ",s[i]);
else
printf("%c",s[i]);
}
printf("%d\n",n);
}
}
return 0;
}