好久不写KMP了。重打一遍竟然wa了。。。
代码:
#include<cstdio> #include<cstring> char a[1000050],b[1000050]; int la,lb,nxt[1000050]; void get_nxt() { int j = 1,k = 0; while(j<=lb) { if(!k||b[j]==b[k])nxt[++j]=++k; else k=nxt[k]; } } void kmp() { int j = 0,k = 0; while(j<=la) { if(!k||a[j]==b[k])j++,k++; else k=nxt[k]; if(k==lb+1)printf("%d ",j-k+1),k=nxt[k]; } for(int i=2;i<=lb+1;i++) { printf("%d ",nxt[i]-1); } printf(" "); } int main() { scanf("%s%s",a+1,b+1); la = strlen(a+1); lb = strlen(b+1); get_nxt(); kmp(); return 0; }