#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char t[50005];
char p[50005];
int next[50005];
void get_next(int m)
{
int i=0;
int j=-1;
next[0]=-1;
while(i<m)
{
if(j==-1||p[i]==p[j])
i++,j++,next[i]=j;
else
j=next[j];
}
}
int kmp(int n,int m)
{
int i=0;
int j=0;
int max=0;
if(n>m)
i=n-m;
while(i<n)
{
if(j==-1||t[i]==p[j])
i++,j++;
else
j=next[j];
}
return j;
}
int main()
{
while(scanf("%s%s",p,t)!=EOF)
{
int n=strlen(t);
int m=strlen(p);
get_next(m);
int s=kmp(n,m);
if(s==0)
printf("0\n");
else
{
p[s]='\0';
printf("%s %d\n",p,s);
}
}
return 0;
}
感觉对kmp的理解还不是很深入~~还要多看看
hdu2594
最新推荐文章于 2021-08-26 20:34:43 发布