【题意概述】
【解题思路】
从左往右找,看有几个匹配的字符串,但要注意例如 aaaaaa aa的输出是3 而不是5,可以这样理解:画布需要减去,一旦减去也就没有了的
【AC】
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 char p[1005],s[1005]; 5 int pLen,sLen,Next[1005],ans; 6 7 void GetNext() 8 { 9 Next[0] = -1; 10 int k = -1; 11 int j = 0; 12 while (j < pLen ) 13 { 14 //p[k]表示前缀,p[j]表示后缀 15 if (k == -1 || p[j] == p[k]) 16 { 17 ++k; 18 ++j; 19 Next[j] = k; 20 } 21 else 22 { 23 k = Next[k]; 24 } 25 } 26 } 27 28 int KmpSearch() 29 { 30 int i = 0; 31 int j = 0; 32 int ans = 0; 33 34 35 while (i !=sLen && j != pLen) 36 { 37 //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++ 38 if (j == -1 || s[i] == p[j]) 39 { 40 i++; 41 j++; 42 } 43 else 44 { 45 //②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j] 46 //next[j]即为j所对应的next值 47 j = Next[j]; 48 } 49 50 if(j == pLen) { 51 ans++; 52 j = 0; 53 } 54 55 } 56 57 return ans; 58 } 59 60 61 int main() { 62 63 while(~scanf("%s", s)&&s[0] != '#') { 64 ans = 0; 65 scanf("%s",p); 66 pLen = strlen(p); 67 sLen = strlen(s); 68 GetNext(); 69 ans = KmpSearch(); 70 printf("%d ",ans); 71 } 72 73 }