Bailian4042 Rabin-Karp字符串匹配

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章