题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=5
题目思路:
典型的KMP,关键就是修改一下,找到了模式串p之后,继续从大的串s里面模式串开始的位置的下一个位置开始找下一个。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 using namespace std; 6 char p[1000], s[1000]; 7 int next[1000]; 8 void getnext() { 9 int i = 0, j = -1, len = strlen(p); 10 next[0] = -1; 11 while (i < len - 1) { 12 if (j == -1 || p[j] == p[i]) { 13 j++; i++; next[i] = j; 14 } 15 else j = next[j]; 16 } 17 } 18 int kmp() { 19 int i = -1, j = -1, lenp = strlen(p), lens = strlen(s); 20 getnext(); 21 int num = 0; 22 while (i < lens) { 23 if (j == -1 || s[i] == p[j]) {++i; ++j;} 24 else j = next[j]; 25 if (j == lenp) {i-=j; j = -1; num++;} 26 } 27 return num; 28 } 29 int main(void) { 30 int n; 31 while (~scanf("%d", &n)) 32 while (n--){ 33 scanf("%s%s", p, s); 34 printf("%d\n", kmp()); 35 } 36 37 return 0; 38 }
复习了一下KMP,很有意思~
看到了一个STL的方法,碉堡了……
1 #include <cstdio> 2 #include <iostream> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <cstring> 6 using namespace std; 7 string s, p; 8 int main(void) { 9 int n; 10 while (~scanf("%d", &n)) { 11 while (n--) { 12 cin >> p >> s; 13 int num = 0; unsigned ans = 0; 14 ans = s.find(p, 0); 15 while (ans != string::npos) { 16 num++; 17 ans = s.find(p, ans+1); 18 } 19 printf("%d\n", num); 20 } 21 } 22 23 return 0; 24 }
这么短的代码就搞定了……看来STL一定要好好学啊!
http://www.cplusplus.com/reference/string/string/find/