AcWing 831. KMP字符串
给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。
模板串P在模式串S中多次作为子串出现。
求出模板串P在模式串S中所有出现的位置的起始下标。
#include<bits/stdc++.h> #define N 1000010 using namespace std; char s[N],p[N]; int n,m; int ne[N]; int main() { cin>>n>>p+1>>m>>s+1; for(int i=2,j=0;i<=n;i++) { while(j&&p[j+1]!=p[i])j=ne[j]; if(p[i]==p[j+1])j++; ne[i]=j; } for(int i=1,j=0;i<=m;i++) { while(j&&p[j+1]!=s[i])j=ne[j]; if(s[i]==p[j+1])j++; if(j==n) { printf("%d ",i-n); j=ne[j]; } } return 0; }