hi.剪花布条(KMP)

文章介绍了如何使用Knuth-Morris-Pratt(KMP)算法解决一个问题,即在给定的花布条和小饰条的ASCII字符表示中,找到花布条中可以剪出的最大小饰条数量。通过next数组计算和KMP匹配,找出匹配的子串数量作为答案。
摘要由CSDN通过智能技术生成

4187. 剪花布条(KMP)

题目描述

一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。

对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?

输入格式

输入数据为多组数据,读取到 # 字符时结束。

每组数据仅有一行,为由空格分开的花布条和小饰条。花布条和小饰条都是用可见 A S C I I ASCII ASCII 字符表示的,不会超过 1000 1000 1000 个字符。

注意:这个 # 应为单个字符。若某字符串开头有 #,不意味着读入结束!

输出格式

对于每组数据,输出一行一个整数,表示能从花纹布中剪出的最多小饰条个数。

数据范围

对于全部数据,字符串长度 ≤ 1000 ≤1000 1000

下标从1开始的写法

在这里插入图片描述

测试用例

输入样例 1:

abcde a3
aaaaaa aa
#

输出样例 1:

0
3

输入样例 2:

abcdecfg a12a
aabbaa ab
##bvbb#c #b
sswq13zfrg s
#

输出样例 2:

0
1
1
2

输入样例 3:

vgdbiyenck di
jbd5639ydbbdn bd
bbdggsabazbbs bb
nvnv###dnunv nv
#

输出样例 3:

0
2
2
3

输入样例 4:

abbbbaaabbabbssshh bb
bhbhbhhaabhbhbd bh
#d#d#fg5664778134 d#
#

输出样例 4:

4
5
2

输入样例 5:

vvvfffeefvffvfv fv
hggvhgdchgxs hg
ll##s##s44#s#sa#a #s#
0978676745647yhh 67
#

输出样例 5:

3
3
2
2

代码内容(下标从0开始的写法)

// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>
#include <iostream>

using namespace std;

typedef long long ll;
const ll N=1e6+10;

ll ne[N];

int main()
{
    ll n,m;
    string s,p;
    while(1)
    {
        cin>>s;
        if(s[0]=='#'&&s[1]=='\0')
            break;
        n=s.size();
        cin>>p;
        m=p.size();

        memset(ne,0,sizeof 0);//初始化
        
        //求next的过程
        ne[0]=-1;
        for(ll i=1,j=-1;i<m;i++)
        {
            while(j>=0&&p[i]!=p[j+1]) j=ne[j];
            if(p[i]==p[j+1]) j++;
            ne[i]=j;
        }

        // kmp 匹配过程
        ll index=0;
        for(ll i=0,j=-1;i<n;i++)
        {
            while(j>=0&&s[i]!=p[j+1]) j=ne[j];
            if(s[i]==p[j+1]) j++;
            if(j==m-1)
            {
                index++;
                //j=ne[j];//有重合
                j=-1;//不能有重合
            }
        }

        cout<<index<<endl;
    }

    return 0;
}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pretty Boy Fox

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值