4042:Rabin-Karp字符串匹配
總時間限制: 1000ms 內存限制: 65536kB
描述
現在有一個僅由小寫字母組成的字符串S,假定將字母a,b,c…z依次編號爲1,2,3…26,現在要在S中找到所有長度爲m的且字母編號和爲q的子串。
輸入
第一行輸入N,表示測試數據的個數,以下N行每行包含一個測試數據
一行測試數據由三部分組成:字符串S(長度不超過100)、m(m小於S的長度)、q。
輸出
輸出符合條件的子串個數
後面每行輸出一個相應的子串
樣例輸入
1
abcabc 3 6
樣例輸出
4
abc
bca
cab
abc
問題鏈接:Bailian4042 Rabin-Karp字符串匹配
問題簡述:(略)
問題分析:這個問題似乎與Rabin-Karp 算法(字符串快速查找算法)沒有關係,只是一個字符串處理計算問題,或者說是一個文本處理問題。看程序代碼,不解釋。
程序說明:(略)
參考鏈接:(略)
題記:(略)
AC的C++語言程序如下:
/* Bailian4042 Rabin-Karp字符串匹配 */
#include <iostream>
using namespace std;
const int N = 100;
int cnt, ans[N];
int main()
{
int n, m, q;
cin >> n;
while(n--) {
string s;
cin >> s >> m >> q;
cnt = 0;
for(int i = 0; i <= (int)s.size() - m; i++) {
int sum = 0;
for(int j = i; j < i + m; j++)
sum += s[j] - 'a' + 1;
if(sum == q) ans[cnt++] = i;
}
cout << cnt << endl;
for(int i = 0; i < cnt; i++) {
for(int j = ans[i]; j < ans[i] + m; j++)
cout << s[j];
cout << endl;
}
}
return 0;
}