算法小白KMP入门(捂脸)

先放题吧...

可重叠子串 (Ver. I)

题目描述

给定一个字符串(模式串)和一些待查找的字符串,求每个待查找字符串在模式串中出现的次数(可重叠)

输入

测试数据有多组(测试组数 <= 5),

第一行包括一个字符串P,长度不超过105,且非空串

第二行包括一个整数N,代表待查找的字符串数量 (1 <= N <= 5)

接下来的N行,每一行包括一个待查找的字符串,其长度不超过50,且非空串

输出

对于每组测试数据,

输出每个待查找字符串出现的次数,

具体输出见样例

样例输入

aabbcc

3

aa

bb

cc

ababab

1

aba

样例输出

aa:1

bb:1

cc:1

aba:2

按照大佬们的意思这是KMP算法的模板题...今天下午之前我连什么是KMP都还不知道...啃了一下午的KMP。

这个大佬有关KMP算法的博客写得非常好:http://www.cnblogs.com/SYCstudio/p/7194315.html(我这个菜鸡看了好久才弄懂)

然后我的代码也还是有直接抄大佬的(等我之后重新做再更新完全是自己写的吧(捂脸))。

代码如下:

#include <iostream>
#include <cstring>
using namespace std;
int Next[1001];

void get_Next(string patten)
{
    memset(Next,-1,sizeof(Next));
    for(int i=1;i<(int)patten.length();i++){
        int j=Next[i-1];
        while((patten[j+1]!=patten[i]) && (j>=0))
            j=Next[j];
        if(patten[j+1]==patten[i])
            Next[i]=j+1;
    }
}

int KMP_getcount(string target,string patten)
{
    int n=target.length();
    int m=patten.length();
    get_Next(patten);
    int count=0;
    int i=0,j=0;
    while(i<n){
        if(target[i]==patten[j]){
            i++;
            j++;
            if(j==m){
                count++;
                j=Next[j-1]+1;
            }
        }
        else{
            if(j==0)
                i++;
            else
                j=Next[j-1]+1;
        }
    }
    return count;
}

int main()
{
    string target;
    string patten;
    while(cin>>target){
        int n;
        cin>>n;
        while(n--){
            cin>>patten;
            int count=KMP_getcount(target,patten);
            cout<<patten<<":"<<count<<endl;
        }
    }
    return 0;
}

大佬们轻喷。

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值