#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define ss(x) scanf("%d",&x)
const int maxn=1000+5;
char s[maxn],str[maxn];
int f[maxn];
void getfail(char *p,int *f)
{
int m=(int)strlen(p);
f[0]=0;f[1]=0;
rep(i,1,m-1)
{
int j=f[i];
while(j&&p[i]!=p[j]) j=f[j];
f[i+1]=(p[i]==p[j])?j+1:0;//p[i]==p[j],那么i+1前面有j位是匹配上了的,所以f[i+1]=j+1;
}
}
void find(char *t,char *p,int *f)
{
int n=(int)strlen(t),m=(int)strlen(p);
getfail(p,f);
int j=0;
rep(i,0,n-1)
{
while(j&&t[i]!=p[j]) j=f[j];
if(t[i]==p[j]) j++;
if(j==m) printf("%d\n",i-m+1);
}
}
int main()
{
while(scanf("%s%s",s,str)!=EOF)
{
memset(f,0,sizeof(f));
find(s,str,f);
}
return 0;
}
KMP
最新推荐文章于 2023-01-23 18:57:44 发布