P3375【模板】KMP字串匹配
阿新 • • 發佈:2018-12-20
這道題其實幾周前就已經切掉了,但是偶然間發現自己還沒發部落格,就來補一篇好了。
KMP這個東西,網上講得太複雜,其實很簡單,也很容易解釋。
就是分為兩部分:
- 先維護next陣列(得先知道對next的定義吧?不知道可以上網查查)
- 利用已經求好的next來計算。
提醒一下,注意邊界判斷。
不會的可以直接看我的程式碼,反正很短,理解了定義,直接看程式碼就不會是問題。
程式碼如下:
#include<cstdio> #include<cstring> using namespace std; #define maxn 1000005 chars[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; }
如果你還沒看懂,再去看看有關陣列的定義,稀裡糊塗不懂原理是學不好的。
當然,我的方法可能有點笨,也請多包涵。