信奥一本通1465 KPM例题

题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1465

题目描述:给出花布条和小饰条(字符串),求花布条中能剪出几块小饰条。

先来一个暴力代码  (这题测试点是真氵,暴力竟然过了)

#include<bits/stdc++.h>
using namespace std;
int next[1001],i=0,j=0,we=0;
string a,b;
int main(){
while(cin>>a){
we=0;
i=0;
j=0;
if(a=="#"){
break;
}
else{
cin>>b;
int as=a.size();
int bs=b.size();
while(i<as){
if(a[i]!=b[j]){
i=i-j+1;
j=0;
}else{
i++;
j++;
}
if(j==bs){
we++;
j=0;
}
}
cout<<we<<endl;
}
}
}

暴力自然不用多说,挨个比就行。匹配成功就接着往下匹配,失败就回去重新匹配。

但是,这种暴力法时间复杂度可高,遇到数据大的情况得全TLE。

那怎么办呢?

这就要介绍一种NB的算法——KMP算法。

这种算法是当子串与母串匹配不一样时,母串不动,计算出下一步子串移动的位置next [ j ],从而节省时间。

上代码:

#include<bits/stdc++.h>
using namespace std;
int nextl[1001]={0};//这个数组名不能直接用next,容易报错
string a,b;
int KMP(){
int i=0,j=0,we=0;
int as=a.size(),bs=b.size();
while(i<as){
if(a[i]==b[j]||j==-1){//当单个字符匹配成功或前面没东西
i++;
j++;//i,j都往前挪
if(j==bs){//字符串匹配成功
we++;
j=0;//子串归0
}
}else{
j=nextl[j];//上next数组,移动到下一个位置
}
}
return we;
}
void Next(){//计算next数组值
int bs=b.size();
nextl[0]=-1;//代表前面没东西
int j=0,k=-1;
while(j<bs){
if(k==-1||b[j]==b[k]){//当前面没有东西或j、k对应的字符一样
nextl[j++]=k++;//直接往后挪一位,因为前几位字符=后几位字符或前面啥也没有
}else{
k=nextl[k];
}
}
}
int main(){//不必多说了
while(cin>>a){
if(a=="#"){
break;
}else{
cin>>b;
Next();
cout<<KMP()<<endl;
}
}
}

题解0012:剪花布条(KMP)的更多相关文章

  1. HDU 2087 - 剪花布条 - [KMP算法]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...

  2. HDU 2087 剪花布条 (KMP 不允许重叠的匹配)

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

  3. hdu 2087剪花布条 (KMP入门 子串出现的次数和子串个数)

    剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. C - 剪花布条 (KMP例题)

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

  5. HDU 2087 剪花布条(字符串匹配,KMP)

    HDU 2087 剪花布条(字符串匹配,KMP) Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出 ...

  6. 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP

    题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...

  7. (KMP)剪花布条 -- hdu -- 2087

    http://acm.hdu.edu.cn/showproblem.php?pid=2087 剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory ...

  8. HDU 2087 剪花布条 (简单KMP或者暴力)

    剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. HDU-2087 剪花布条 字符串问题 KMP算法 查匹配子串

    题目链接:https://cn.vjudge.net/problem/HDU-2087 题意 中文题咯 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条, ...

  10. 剪花布条 --HDOJ 2087

    剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

随机推荐

  1. Atomic 的实现原理

    1.直接操作内存,使用Unsafe 这个类 2.使用 getIntVolatile(var1, var2) 获取线程间共享的变量 3.采用CAS的尝试机制(核心所在),代码如下: public fin ...

  2. Spark学习摘记 —— RDD行动操作API归纳

    本文参考 参考<Spark快速大数据分析>动物书中的第三章"RDD编程",前一篇文章已经概述了转化操作相关的API,本文再介绍行动操作API 和转化操作API不同的是, ...

  3. Tomcat之“VM options配置”

    VM options: -Dfile.encoding=UTF-8

  4. DASCTF Oct吉林工师web

    迷路的魔法少女 进入环境给出源码 <?php highlight_file('index.php'); extract($_GET); error_reporting(0); function ...

  5. PCB基础知识(一)

    在电子行业有一个关键的部件叫做PCB(printed circuit board,印刷电路板).这是一个太基础的部件,导致很多人都很难解释到底什么是PCB.这篇文章将会详细解释PCB的构成,以及在PC ...

  6. canvas元素内容生成图像文件

    准备工作 想要将canvas元素当前显示的内容生成为图像文件,我们首先要获取canvas中的数据,在HTML5 <canvas>元素的标准中提供了toDataURL()的方法可以将canv ...

  7. pip freeze > requirements.txt` 命令输出文件中出现文件路径而非版本号

    pip freeze > requirements.txt 命令输出文件中出现文件路径而非版本号 解决办法: pip list --format=freeze > requirements ...

  8. Mybatis + js 实现下拉列表二级联动

    Mybatis + js 实现下拉列表二级联动 学习内容: 一.业务需求 二.实现效果 三.代码实现 1. province_city.jsp 2. TwoController 2. Province ...

  9. 手写封装防抖debounce

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. CSS简单样式练习(五)

    运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...