4042:Rabin-Karp字符串匹配

本文介绍如何使用Rabin-Karp算法在给定的小写字母组成的字符串中找到所有长度为m且字母编号和为q的子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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
样例输出

abc 
bca 
cab 
abc

 
源码(OpenJudge通过)
#include"stdio.h"
#include"string.h"
#define N 100

int main()
{
int count,m,q,len;
int i,j,k,sum;
char str[N];
int flag[N];
scanf("%d",&count);
while(count >0)
{
scanf("%s",str);
scanf("%d",&m);
scanf("%d",&q);
len=strlen(str);
sum=0;
k=0;
for(i=0;i<len;i++)
{
for(j=i;j<i+m;j++)
{
sum = sum + (int)str[j] - 96;
}
if(sum==q)
{
flag[k]=i;
k++;
}
sum=0;
}
printf("%d\n",k);
for(i=0;i<k;i++)
{
for(j=flag[i]; j<flag[i]+m; j++)
printf("%c",str[j]);
printf("\n");
}
count--;
}
return 0;
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值