Binary String Matching
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
Given two strings A and B, whose alphabet consist only ‘0’ and ‘1’. Your task is only to tell how many times does A appear as a substring of B? For example, the text string B is ‘1001110110’ while the pattern string A is ‘11’, you should output 3, because the pattern A appeared at the posit
-
输入
- The first line consist only one integer N, indicates N cases follows. In each case, there are two lines, the first line gives the string A, length (A) <= 10, and the second line gives the string B, length (B) <= 1000. And it is guaranteed that B is always longer than A. 输出
- For each case, output a single line consist a single integer, tells how many times do B appears as a substring of A. 样例输入
-
3 11 1001110110 101 110010010010001 1010 110100010101011
样例输出
-
3 0 3
这个题的数据很水,可以使用暴力AC,但是还是使用KMP比较好
1.
//暴力 #include <iostream> #include <cstring> using namespace std; int n; int ans; char a[20], b[1010]; int main() { cin >> n; while (n--){ ans = 0; cin >> a >> b; int lena = strlen(a); int lenb = strlen(b); for (int i = 0; i <= lenb - lena; i++){ for (int j = 0; j < lena; j++){ if (a[j] != b[i + j]){ break; } if (j == lena - 1) ans++; } } cout << ans << endl; } return 0; }
2.//KMP模板 #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1010; int n; int next[maxn]; char s[maxn], t[maxn]; int slen, tlen; void getNext() { int j = 0, k = -1; next[0] = -1; while (j < slen){ if (k == -1 || s[j] == s[k]) next[++j] = ++k; else k = next[k]; } } int kmp_count() { int ans = 0; int i, j = 0; if (slen == 1 && tlen == 1){ if (s[0] == t[0]) return 1; else return 0; } getNext(); for (i = 0; i < tlen; i++){ while (j > 0 && t[i] != s[j]) j = next[j]; if (s[j] == t[i]) j++; if (j == slen){ ans++; j = next[j]; } } return ans; } int main() { cin >> n; while (n--){ cin >> s >> t; slen = strlen(s); tlen = strlen(t); cout << kmp_count() << endl; } return 0; }