#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn = 1e6+5;
int Next[maxn],j=-1;
char A[maxn],B[maxn];
int main(){
scanf("%s%s",A,B);
Next[0]=-1;
int la=strlen(A),lb=strlen(B);
for(int i=1;i<lb;i++){
while(B[j+1]!=B[i]&&j>=0){
j=Next[j];
}
if(B[j+1]==B[i]){
j++;
}
Next[i]=j;
}
j=-1;
for(int i=0;i<la;i++){
while(j>=0&&B[j+1]!=A[i]){
j=Next[j];
}
if(B[j+1]==A[i]){
j++;
}
if(j==lb-1){
cout<<i-j+1<<endl;
j=Next[j];
}
}
for(int i=0;i<lb;i++){
cout<<Next[i]+1<<" ";
}
system("pause");
return 0;
}
洛谷P3375 KMP 模板
最新推荐文章于 2024-04-10 14:32:59 发布