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)相关推荐

  1. (剪花布条、客似云来)笔试强训

    博主简介:想进大厂的打工人 博主主页:@xyk: 所属专栏: JavaEE初阶 两道编程题~~~ 目录 文章目录 一.[编程题]客似云来 二.[编程题]剪花布条 一.[编程题]客似云来 链接:客似云来 ...

  2. 【Java版oj】day33剪花布条、客似云来

    目录 一.剪花布条 (1)原题再现 (2)问题分析 (3)完整代码 二.客似云来 (1)原题再现 (2)问题分析 (3)完整代码 一.剪花布条 (1)原题再现 剪花布条__牛客网         一块 ...

  3. Day 33 剪花布条+客似云来

    目录 1.剪花布条 2.客似云来 1.剪花布条 链接:剪花布条__牛客网 来源:牛客网 [编程题]剪花布条 热度指数:1327 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M, ...

  4. 【HDU - 2087】 剪花布条(直接模拟 or KMP)

    题干: 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input输入中含有一些数据,分别是成对出现的花 ...

  5. 剪花布条(字符串,C++)

    题目描述 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据为多组数据,读取到 # 字符 ...

  6. 【HDU】2087 剪花布条 (KMP算法的应用)

    可以参考:从头彻尾彻底理解KMP 可以用朴素的模式匹配算法,也可以使用KMP算法,KMP算法所用的时间较短 普通版 #include <iostream> #include <str ...

  7. hdu2087 剪花布条 暴力/KMP

    在字符串中不可重叠地寻找子串数量,暴力/KMP 1 #include<stdio.h> 2 #include<string.h> 3 4 int main(){ 5 char ...

  8. 《剪花布条》:从花布条中尽可能剪出几块小饰条

    目录 一.题目 二.思路 1.代码中要使用的String类中的方法 (1)判断 s 中是否有 t (2)将 s 分割 2.递归判断 三.代码 详细注释版本 简化注释版本 一.题目 题目:剪花布条    ...

  9. 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?

    一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 解析: import java.util.*; publ ...

  10. 2016 UESTC Training for Search Algorithm String I - 谭爷剪花布条 KMP

    I - 谭爷剪花布条 Time Limit: 3000/100MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

最新文章

  1. 安卓高手之路之 WindowManager
  2. java导出word(带图片)
  3. 第21讲:IP代理池的搭建和使用
  4. According to a report from Bleeping Computer
  5. P3047 [USACO12FEB]附近的牛Nearby Cows
  6. Timus 1079. Maximum
  7. java.util.timer 定时任务_java.util系列源码解读之Timer定时器
  8. Mysql SQLyog 使用详解
  9. IDEA 炫酷编辑器主题大全,真的好看
  10. Instrument API介绍
  11. JAVA实现GMT转换北京时间
  12. 附上解决迅雷9及迅雷极速版任何资源下载任务出错、内容违规问题
  13. GOOGLE HACKS巧妙使用网络搜索的技巧和工具(第二版)已经出版
  14. 企立方:拼多多用客服机器人怎么样
  15. STM32 FSMC TFT LCD
  16. BlockingQueue是什么?
  17. 100条经典C++笔试题目及答案分享
  18. Exception in thread “Thread-2“ java.util.ConcurrentModificationException异常的解决方案
  19. 一文搞懂k近邻(k-NN)算法(一)
  20. 流体力学控制方程——能量方程

热门文章

  1. 面试中的智力题及编程实践(二)
  2. 【清单】语言、框架及库的官方文档、examples、tutorials
  3. 递归 —— 作为全局变量 vs 作为参数
  4. numpy 辨异 (五)—— numpy.ravel() vs numpy.flatten()
  5. 没有计算机基础可以学python-零基础,没有编程和计算机基础,究竟该怎么自学python?...
  6. python学到什么程度可以找到工作-Python学到什么程度可以面试工作?
  7. 腾讯云:一句话语音识别API接入步骤和说明
  8. java计算器用什么布局_求JAVA语言写的计算器的代码。用GridLayout布局。
  9. 两位一体数码管引脚图_LED数码管你知道多少?
  10. 正则 文字输入不超过5个汉字或者10个字符