HDU 2087 剪花布条【KMP】
发布日期:2021-07-01 02:50:16
浏览次数:2
分类:技术文章
本文共 2102 字,大约阅读时间需要 7 分钟。
Problem Description
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000
个字符长。如果遇见 #
字符,则不再进行工作。 Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0
,每个结果之间应换行。 Sample Input
abcde a3aaaaaa aa#
Sample Output
03
题意:找到可能剪出的最多的小饰条数目。
思路:本题可以完全套用KMP。找到的匹配可能有很多个,而且可能重合,本题中需要找到能够分开的子串,即剪出不同的小饰条。这个问题很简单,直接在一次完全匹配后,让 j = 0
匹配永不回溯的 i
的新位置即可。
代码如下:
#includeusing namespace std;const int maxn = 1010;char s[maxn], p[maxn];int nextArr[maxn]; int slen, plen;namespace kmp1 { void getNext() { //预先计算nextArr[],用于在失配的情况下得到回溯的位置 nextArr[0] = 0, nextArr[1] = 0; for (int i = 1; i < plen; ++i) { int j = nextArr[i]; while (j && p[i] != p[j]) j = nextArr[j]; nextArr[i + 1] = (p[i] == p[j] ? j + 1 : 0); } } int kmp() { //在s中找到p if (slen < plen) return 0; getNext(); int j = 0, ans = 0; //last=-1; //last指向上次匹配的末尾位置 for (int i = 0; i < slen; ++i) { //匹配s和p的每个字符 while (j && s[i] != p[j]) j = nextArr[j]; //失配后用nextArr[]找j的回溯位置 if (s[i] == p[j]) ++j; //当前位置的字符匹配,继续 if (j >= plen) { //完全匹配 ++ans; j = 0; } /* if (i - last >= plen) { //判断新的匹配和上个匹配能否分开 ++ans; last = i; } */ } return ans; }}namespace kmp2 { void getNext() { nextArr[0] = -1, nextArr[1] = 0; int pos = 2, cn = 0; while (pos < plen) { if (p[pos - 1] == p[cn]) nextArr[pos++] = ++cn; else if (cn > 0) cn = nextArr[cn]; else nextArr[pos++] = cn; } } int kmp() { if (slen < plen) return 0; getNext(); int i = 0, j = 0, ans = 0; while (i < slen && j < plen) { if (s[i] == p[j]) ++i, ++j; else if (nextArr[j] != -1) j = nextArr[j]; //j != 0 else ++i; //else if (nextArr[j] == -1) ++i; //else j = nextArr[j]; if (j >= plen) { //匹配完了一次 ++ans; j = 0; } } return ans; }} int main() { while (~scanf("%s", s)) { if (s[0] == '#') break; scanf("%s", p); slen = strlen(s), plen = strlen(p); //printf("%d\n", kmp1::kmp()); printf("%d\n", kmp2::kmp()); } return 0;}
转载地址:https://memcpy0.blog.csdn.net/article/details/108244851 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年05月06日 05时19分20秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
命名难,难于上青天
2019-05-01
没钱没公司,怎么做一款付费产品
2019-05-01
代码整洁之道-编写 Pythonic 代码
2019-05-01
树莓派程序开机自启动
2019-05-01
连锁门店无线通信方案
2019-05-01
配置Lotus Domino集群视频详解
2019-05-01
Linux软件万花筒
2019-05-01
全球开源软件发展趋势分析
2019-05-01
Linux常用的安全工具
2019-05-01
python 多进程之进程池的操作
2019-05-01
flask整理之 flask程序中的debug模式
2019-05-01
比特币,父母这一辈能接受吗?
2019-05-01
为什么要反对比特币,这不代表是空气币
2019-05-01
SnapEx的新感觉,对新手很友好
2019-05-01
首个聚合器怎么产生的,并运用领域在什么
2019-05-01
区块链技术应用,最先医疗行业
2019-05-01
新币上市旧币会降价吗
2019-05-01
当博士进入币圈会怎么样
2019-05-01
PHP之 使用PHPMailer插件实现邮件发送功能
2019-05-01