kmp模板
题目:https://www.luogu.com.cn/problem/P3375
for(int i=2,j=0;i<=m;++i){
while(j && p[i]!=p[j+1]) j = ne[j];
if(p[i]==p[j+1]) j++;
ne[i]=j;
}
for(int i=1,j=0;i<=n;++i){
while(j && s[i]!=p[j+1]) j = ne[j];
if(s[i]==p[j+1]) j++;
if(j==m){
printf("%d\n",i-j+1);
j = ne[j];
}
}
for(int i=1;i<=m;++i){
printf("%d ",ne[i]);
}
完整代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 1e6+5;
char s[M],p[M];
int ne[M];
int main(){
cin>>s+1>>p+1;
int n = strlen(s+1);
int m = strlen(p+1);
for(int i=2,j=0;i<=m;++i){
while(j && p[i]!=p[j+1]) j = ne[j];
if(p[i]==p[j+1]) j++;
ne[i]=j;
}
for(int i=1,j=0;i<=n;++i){
while(j && s[i]!=p[j+1]) j = ne[j];
if(s[i]==p[j+1]) j++;
if(j==m){
printf("%d\n",i-j+1);
j = ne[j];
}
}
for(int i=1;i<=m;++i){
printf("%d ",ne[i]);
}
}