hdu 2087(kmp)
1 /* 2 * kmp 3 */ 4 5 #include <cstdio> 6 #include <iostream> 7 8 using namespace std; 9 10 const int N = 1005; 11 12 int next[N]; 13 char str[N], pat[N]; 14 15 void indexNext() { 16 int k = 0; 17 next[1] = 0; 18 for (int i=2; pat[i]; ++i) { 19 while (k && pat[k+1]!=pat[i]) k = next[k]; 20 if (pat[k+1] == pat[i]) ++k; 21 next[i] = k; 22 } 23 } 24 25 int kmp() { 26 int k = 0, cs = 0; 27 int lenPat = strlen(pat) - 1; 28 for (int i=1; str[i]; ++i) { 29 while (k && pat[k+1]!=str[i]) k = next[k]; 30 if (pat[k+1] == str[i]) ++k; 31 if (k == lenPat) ++cs, k = 0; 32 } 33 return cs; 34 } 35 36 int main() { 37 str[0] = pat[0] = ' '; 38 while (scanf("%s", str+1), str[1]!='#') { 39 scanf ("%s", pat+1); 40 indexNext(); 41 printf ("%d\n", kmp()); 42 } 43 return 0; 44 }