一定注意读数据从1偏移开始
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
char a[N],b[N];
int nxt[N];
int main()
{
scanf("%s%s", b+1, a+1);
int n = strlen(a+1), m = strlen(b+1);
for(int i=2, l=0; i<=n; i++)
{
while(l&&a[i]!=a[l+1]) l=nxt[l];
if(a[i]==a[l+1]) l++;
nxt[i] = l;
}
int no = 1;
for(int i=1, l=0; i<=m; i++)
{
while(l&&b[i]!=a[l+1]) l=nxt[l];
if(b[i]==a[l+1]) l++;
if(l==n) no=0, printf("%d\n", i-l+1);
}
if(no) printf("NO");
}