欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Bailian4042 Rabin-Karp字符串匹配

程序员文章站 2022-04-02 18:21:56
...

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;
}