不知道为什么我写的这么复制…好像洛谷上的小伙伴就两三行啊…
这个坑留着以后再补
#include <cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int Next[1000005];
void Getn(char *p){
Next[0]=-1;
int len=strlen(p),j;
for(int i=1;i<len;i++){
j=Next[i-1];
while(j>=0&&p[j+1]!=p[i])
j=Next[j];
if(p[j+1]==p[i])
Next[i]=j+1;
else Next[i]=-1;
}
}
void kmp(char *s,char *p){
Getn(p);
int sl=strlen(s),pl=strlen(p),i=0,j=0;
while(i<sl){
if(s[i]==p[j]){
i++;j++;
if(j==pl){
cout<<i-j+1<<endl;
j=Next[i-1]+1;
}
}
else{
if(j==0)
i++;
else
j=Next[j-1]+1;
}
}
}
int main()
{
char s[1000005],p[1000005];
scanf("%s%s",s,p);
Getn(p);
int l=strlen(p);
kmp(s,p);
for(int i=0;i<l;i++)
cout<<(Next[i]+1)<<' ';
}