柴氏烤馍片,享誉全球(mdzz)
先求失配函数,再匹配
代码丑陋,眼瞎概不负责
【代码】
//KMP算法模板
#include<iostream>
#include<cstdio>
#include<cstring>
#define fo(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
char p[100000],s[100000]; //p:文本 s:模板
int f[100000],a[100000],ans[100000];
void getfail()
{
int j=0;
int len=strlen(s+1);
// f[1]=0;
fo(i,2,len)
{
while(j && s[j+1]!=s[i]) j=f[j];
if(s[j+1]==s[i]) j++;
f[i]=j;
}
}
void find()
{
int j=0;
int len=strlen(p+1),ls=strlen(s+1);
fo(i,1,len)
{
while(j && s[j+1]!=p[i]) j=f[j];
if(s[j+1]==p[i]) j++;
if(j==ls) ans[++ans[0]]=i-ls+1; //匹配首位置
}
}
int main()
{
scanf("%s%s",p+1,s+1);
getfail();
find();
fo(i,1,ans[0]) printf("%d\n",ans[i]);
return 0;
}