hdu 1686
阿新 • • 發佈:2018-11-19
說一下題目大意吧:
一共 T 組測試資料 先給出一個字串 再給一個模板串,問題是模板串中出現了幾個子串
典型的 kmp 水題
我們在構造好 next 陣列和 kmp 演算法後需要做一個改動
那就是 當 j 走到盡頭後 不要跳出迴圈了。。調整一下然後繼續跑,(注意這裡 i j 都是跑到了 i+1 和 j+1 先回溯一下),然後計數一下,然後一直跑到 i 走到盡頭,輸出計數就好了。。
下邊是AC程式碼,頭一次接觸 kmp 發現還可以。。還需要多練習
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> using namespace std; const int maxn = 1e6 +50; int nex[maxn]; char c1[maxn],c2[maxn]; void getnex() { int len = strlen(c1); nex[0]=-1; int j=0; int k=-1; while(j<len-1) { if(k==-1||c1[k]==c1[j]) nex[++j]=++k; else k=nex[k]; } } int k; int kmp() { int i=0,j=0; int k=0; int l1 = strlen(c1); int l2 = strlen(c2); getnex(); while(i<l2) { if(j == -1 || c2[i]==c1[j]) { i++; j++; } else j = nex[j]; if(j == l1) { k++; i--,j--; j=nex[j]; } } return k; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%s%s",c1,c2); printf("%d\n",kmp()); } return 0; }