【HDOJ2087】剪花布条(KMP)
problem
- 给定字符串A,B。求串A中可以分割出多少个互不相同的串B(不能重叠)。
solution
模板题,没啥好说的。
KMP匹配:如果成功,就把j==0,从头开始匹配,答案累加。
codes
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1010;char a[maxn], b[maxn];
int n, m, Next[maxn], f[maxn];void pre(){Next[1] = 0;int j = 0;for(int i = 1; i < m; i++){while(j>0 && b[i+1]!=b[j+1])j = Next[j];if(b[i+1]==b[j+1])j++;Next[i+1] = j;}
}
int kmp(){int ans = 0, j = 0;for(int i = 0; i < n; i++){while(j>0 && a[i+1]!=b[j+1])j = Next[j];if(a[i+1]==b[j+1])j++;f[i+1] = j;if(j==m)ans++, j = 0;}return ans;
}int main(){while(cin>>a+1){if(a[1]=='#')break;scanf("%s",b+1);n = strlen(a+1);m = strlen(b+1);pre();printf("%d\n",kmp());}return 0;
}
KMP
介绍:
字符串匹配问题:给定主串A和模式串B,求所有B在A中出现的位置。
传统做法:枚举A串从什么位置开始与B串匹配,然后验证是否匹配。最坏情况A=”aaaaaaaaaaaaaaab”,B=”aaaaaab”,复杂度O(mn)。
KMP:最坏情况复杂度O(n)
具体:
本质原理:
考虑情况(当前i==5):
i = 1 2 3 4 5 6 7 8 9
A = a b a b a b a a b a b
B = a b a b a c b
j = 1 2 3 4 5 6 7 8 9
对于下一个,不再匹配了。传统做法就是把B右移一位继续重头比较。
但是作为一个人,我一眼就看出了右移一位也不行,,,,于是,我们移到他下一个匹配的位置(最长的相同前缀和后缀)在开始比较。并且最好是这个匹配的长度尽可能长。
i = 1 2 3 4 5 6 7 8 9
A = a b a b a b a a b a b
B = a b a b a c b
j = 1 2 3 4 5 6 7 8 9
再考虑到,B移动后的位置,相对A而言的位置关系,其实是和B移动前的位置关系是一样的(因为之前的时候AB匹配上了,所以是字母是完全一样的)。所以就变成了关于B的自我匹配,具体见下方。
两个步骤:
1、对模式串B进行自我匹配:求一个数组next,其中next[i]表示”B中以i结尾的非前缀子串”与“B的前缀”能匹配的最大长度。next[i]=max{j},j<i且A[i−j+1,i]=A[1,j]next[i]=max{j},j<i且A[i−j+1,i]=A[1,j] next[i] = max\{j\}, j。
2、对字符串A与B进行匹配:求一个数组f,其中f[i]表示”A中以i结尾的子串”与“B的前缀”能够匹配的最长长度。(当长度为B.size()时即得到答案)
具体求法:
1、求next:
咕咕咕
【HDOJ2087】剪花布条(KMP)相关推荐
- (剪花布条、客似云来)笔试强训
博主简介:想进大厂的打工人 博主主页:@xyk: 所属专栏: JavaEE初阶 两道编程题~~~ 目录 文章目录 一.[编程题]客似云来 二.[编程题]剪花布条 一.[编程题]客似云来 链接:客似云来 ...
- 【Java版oj】day33剪花布条、客似云来
目录 一.剪花布条 (1)原题再现 (2)问题分析 (3)完整代码 二.客似云来 (1)原题再现 (2)问题分析 (3)完整代码 一.剪花布条 (1)原题再现 剪花布条__牛客网 一块 ...
- Day 33 剪花布条+客似云来
目录 1.剪花布条 2.客似云来 1.剪花布条 链接:剪花布条__牛客网 来源:牛客网 [编程题]剪花布条 热度指数:1327 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M, ...
- 【HDU - 2087】 剪花布条(直接模拟 or KMP)
题干: 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input输入中含有一些数据,分别是成对出现的花 ...
- 剪花布条(字符串,C++)
题目描述 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据为多组数据,读取到 # 字符 ...
- 【HDU】2087 剪花布条 (KMP算法的应用)
可以参考:从头彻尾彻底理解KMP 可以用朴素的模式匹配算法,也可以使用KMP算法,KMP算法所用的时间较短 普通版 #include <iostream> #include <str ...
- hdu2087 剪花布条 暴力/KMP
在字符串中不可重叠地寻找子串数量,暴力/KMP 1 #include<stdio.h> 2 #include<string.h> 3 4 int main(){ 5 char ...
- 《剪花布条》:从花布条中尽可能剪出几块小饰条
目录 一.题目 二.思路 1.代码中要使用的String类中的方法 (1)判断 s 中是否有 t (2)将 s 分割 2.递归判断 三.代码 详细注释版本 简化注释版本 一.题目 题目:剪花布条 ...
- 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 解析: import java.util.*; publ ...
- 2016 UESTC Training for Search Algorithm String I - 谭爷剪花布条 KMP
I - 谭爷剪花布条 Time Limit: 3000/100MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
最新文章
- 安卓高手之路之 WindowManager
- java导出word(带图片)
- 第21讲:IP代理池的搭建和使用
- According to a report from Bleeping Computer
- P3047 [USACO12FEB]附近的牛Nearby Cows
- Timus 1079. Maximum
- java.util.timer 定时任务_java.util系列源码解读之Timer定时器
- Mysql SQLyog 使用详解
- IDEA 炫酷编辑器主题大全,真的好看
- Instrument API介绍
- JAVA实现GMT转换北京时间
- 附上解决迅雷9及迅雷极速版任何资源下载任务出错、内容违规问题
- GOOGLE HACKS巧妙使用网络搜索的技巧和工具(第二版)已经出版
- 企立方:拼多多用客服机器人怎么样
- STM32 FSMC TFT LCD
- BlockingQueue是什么?
- 100条经典C++笔试题目及答案分享
- Exception in thread “Thread-2“ java.util.ConcurrentModificationException异常的解决方案
- 一文搞懂k近邻(k-NN)算法(一)
- 流体力学控制方程——能量方程
热门文章
- 面试中的智力题及编程实践(二)
- 【清单】语言、框架及库的官方文档、examples、tutorials
- 递归 —— 作为全局变量 vs 作为参数
- numpy 辨异 (五)—— numpy.ravel() vs numpy.flatten()
- 没有计算机基础可以学python-零基础,没有编程和计算机基础,究竟该怎么自学python?...
- python学到什么程度可以找到工作-Python学到什么程度可以面试工作?
- 腾讯云:一句话语音识别API接入步骤和说明
- java计算器用什么布局_求JAVA语言写的计算器的代码。用GridLayout布局。
- 两位一体数码管引脚图_LED数码管你知道多少?
- 正则 文字输入不超过5个汉字或者10个字符