修建模板库
kmp就是利用已经匹配过的信息降低复杂度。
每次记录当前位置的最长的后缀等于前缀,然后如果发现当前节点不能匹配,就直接往前跳nxt进行匹配。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char s1[1000005],s2[1000005],s[2000005]; int nxt[2000005]; int main() { scanf("%s%s",s1,s2); int len=strlen(s2); for(int i=1;i<=len;i++) s[i]=s2[i-1]; s[len+1]=' '; int len1=strlen(s1); for(int i=0;i<len1;i++) s[i+len+2]=s1[i]; nxt[0]=0; for(int i=2,j=0;i<=1+len+len1;i++) { while(j&&s[i]!=s[j+1]) j=nxt[j]; if(s[i]==s[j+1]) j++; nxt[i]=j; if(nxt[i]==len&&i>len+1) printf("%d ",i-len-len); } for(int i=1;i<=len;i++) printf("%d ",nxt[i]); return 0; }