KMP模板
对于不常用hash的cj来说一定要背熟kmp啊
1 void kmp_pre(char t[]) 2 { 3 int j, k; 4 int tlen = strlen(t); 5 k = -1, j = 0; nxt[0] = -1; 6 while (j < tlen) 7 { 8 if (k == -1 || t[j] == t[k]) nxt[++j] = ++k; 9 else k = nxt[k]; 10 } 11 } 12 int kmp(char s[], char t[]) 13 { 14 int slen = strlen(s), tlen = strlen(t); 15 int ans = 0; 16 int i = 0, j = 0; 17 kmp_pre(t); 18 while (i < slen) 19 { 20 if (j == -1 || s[i] == t[j]) 21 { 22 i++; 23 j++; 24 } 25 else j = nxt[j]; 26 if (j == tlen) 27 { 28 ans++; 29 //如果只找第一次匹配的位置 这里可以退出了 30 j = nxt[j]; 31 } 32 } 33 return ans; 34 }
//plagiarized from Kuangbin