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;
}
上一篇: shell-判断两个ip是否在同一个网段