KMP
- 算法思想:从n*m的匹配结构,优化为在n上滑动,m根据预处理一步更新到位
- 注意:字符串是从0开始
- 预处理本身就是两个相同字符串的KMP过程
- 代码及注释
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e6+5;
const int maxm = 1e3+5;
char a[maxn],b[maxn];
int nxt[maxm];
inline void make_next()
{
int m=strlen(b),k=0;
for(int i=1;i<m;++i)
{
while(k&&b[i]!=b[k])
k=nxt[k-1];
if(b[i]==b[k])
++k;
nxt[i]=k;
}
}
inline void KMP()
{
int n=strlen(a),m=strlen(b),k=0;
for(int i=0;i<n;++i)
{
while(k&&a[i]!=b[k])
k=nxt[k-1];
if(a[i]==b[k])
++k;
if(k==m)
printf("%d\n",i-m+2);
}
}
inline void print()
{
for(int i=0;i<strlen(b);++i)
printf("%d ",nxt[i]);
}
int main()
{
scanf("%s%s",a,b);
make_next();
KMP();
print();
return 0;
}