1. 程式人生 > >P3375【模板】KMP字串匹配

P3375【模板】KMP字串匹配

  這道題其實幾周前就已經切掉了,但是偶然間發現自己還沒發部落格,就來補一篇好了。

  KMP這個東西,網上講得太複雜,其實很簡單,也很容易解釋。

  就是分為兩部分:

  1. 先維護next陣列(得先知道對next的定義吧?不知道可以上網查查)
  2. 利用已經求好的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++) { if(t[d+1]!=s[c]&&d) 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; }

  如果你還沒看懂,再去看看有關陣列的定義,稀裡糊塗不懂原理是學不好的。

  當然,我的方法可能有點笨,也請多包涵。