下面展示一些 内联代码片
。
#include<iostream>
using namespace std;
const int N =100100,M=1000010;
int n,m;
char p[N],s[M];
int ne[M];//if(ne[M]==j) 表示以M为终点前j个位子长的和1~j-1一样
int main(){
cin.tie(0);
ios::sync_with_stdio(0);
cin>>n>> p+1 >>m >> s+1;
//预处理(对p字符串本身)
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; //记录以i为终点前j个位子长的和1~j-1一样
}
//kmp的匹配过程
for(int i=1 ,j =0 ;i <=m;i++){
while(j && s[i]!= p[j+1]) j=ne[j];//j没有重新开始找
if(s[i] == p[j+1] ) j++;
if(j==n){
cout<<i-n<<" ";//这里可以改编为计数器s中有多少个p
j=ne[j];//再省几步
}
}
}