#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int nextD[N];
int main(){
string sear, fins;
cin>>sear>>fins;
int sear_p=0,fins_p=0;
int ok_len=0,now_p=1;
while(now_p<int(fins.size())){
if(fins[now_p]==fins[ok_len]){
nextD[now_p++]=++ok_len;
}else if(ok_len){
ok_len=nextD[ok_len-1];
}else{
nextD[now_p++]=0;
}
}
while(sear_p<int(sear.size())){
if(sear[sear_p]==fins[fins_p]){
sear_p++;
fins_p++;
}else if(fins_p){
fins_p=nextD[fins_p-1];
}else{
sear_p++;
}
if(fins_p==int(fins.size())){
cout<<sear_p-fins_p+1<<endl;
fins_p=0;
}
}
for(int i=0;i<int(fins.size());i++){
cout<<nextD[i]<<' ';
}
return 0;
}
以上代码只有70分,如有知晓解法者请指出,谢谢!