kmp算法(个数&次数)
kmp模板:
1 // p为模式串,s为主串 2 3 #include <bits/stdc++.h> 4 using namespace std; 5 int nxt[1000005]; 6 char s[1000006], p[1000000]; 7 void GetNext() 8 { 9 int pLen = strlen(p); 10 nxt[0] = -1; 11 int len = -1; 12 int j = 0; 13 while (j < pLen) 14 { 15 //p[k]表示前缀,p[j]表示后缀 16 if (len == -1 || p[j] == p[len]) 17 { 18 ++len; 19 ++j; 20 nxt[j] = len; 21 } 22 else 23 { 24 len = nxt[len]; 25 } 26 } 27 } 28 int KmpSearch() 29 { 30 int i = 0; 31 int j = 0; 32 int sLen = strlen(s); 33 int pLen = strlen(p); 34 int cnt = 0; 35 while (i < sLen && j < pLen) 36 { 37 if (j == -1 || s[i] == p[j]) 38 { 39 i++; 40 j++; 41 } 42 else 43 j = nxt[j]; 44 } 45 if (j == pLen) 46 return i - j; 47 else 48 return -1; 49 } 50 int main() 51 { 52 while (cin >> s >> p) 53 { 54 memset(nxt, 0, sizeof nxt); 55 GetNext(); 56 cout << KmpSearch() << endl; 57 } 58 return 0; 59 }
1.求字串个数,只需要小改一下。
1 int cnt = 0; 2 while (i < sLen) // 1.j要一直往后移,所以不需要 j<pLen 3 { 4 if (j == -1 || s[i] == p[j]) 5 { 6 i++; 7 j++; 8 } 9 else j = nxt[j]; 10 if (j == pLen) {cnt++;j++}; // 2.相等就直接加 11 } 12 return cnt;
2.求字串出现次数,在上面的模板中一句更改为
if (j == pLen){ cnt++; j=nxt[j]; }

浙公网安备 33010602011771号