P3375【模板】KMP字符串匹配
这道题其实几周前就已经切掉了,但是偶然间发现自己还没发博客,就来补一篇好了。
KMP这个东西,网上讲得太复杂,其实很简单,也很容易解释。
就是分为两部分:
- 先维护next数组(得先知道对next的定义吧?不知道可以上网查查)
- 利用已经求好的next来计算。
提醒一下,注意边界判断。
不会的可以直接看我的代码,反正很短,理解了定义,直接看代码就不会是问题。
代码如下:
#include<cstdio> #include<cstring> using namespace std; #define maxn 1000005 char s[maxn],t[maxn]; int next[maxn],sum[maxn]; int main() { scanf("%s",s+1); scanf("%s",t+1); int ss=strlen(s+1); int tt=strlen(t+1); //printf("%d",tt); int d=0,c=1,ans=0; next[1]=0; for(int i=2; i<=tt; i++) { int r=next[i-1]; while(1) { if(r==0) { if(t[1]==t[i]) { r=1; break; } else { r=0; break; } } if(t[r+1]==t[i]) { r=r+1; break; } r=next[r]; } next[i]=r; } for(int c=1; c<=ss; c++) { while(t[d+1]!=s[c]&&d!=0) d=next[d]; if(t[d+1]==s[c]) d++; if(d==tt) { d=next[d]; ans++; sum[ans]=c-tt+1; } } for(int i=1;i<=ans;i++) printf("%d\n",sum[i]); for(int i=1; i<=tt; i++) printf("%d ",next[i]); return 0; }
如果你还没看懂,再去看看有关数组的定义,稀里糊涂不懂原理是学不好的。
当然,我的方法可能有点笨,也请多包涵。