016(剪花布条)(KMP)
题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1465
题目思路:KMP模板题,该说的都在代码里
#include<bits/stdc++.h>
using namespace std;
int nexT[1001],t0,p0;
string t,p;
int KMP(string n,int n0,string m,int m0){
int i=0,j=0,k=0;
while(i<n0){
if(j==-1||n[i]==m[j]){
//如果是在字符串开始或者主子串字符对上了
++i;
++j;
//i,j一起走
if(j==m0){//如果全对完了
i=i+m0-1;
//更新以下i
k++;
//子串数+1
}
}
else{
//否则
j=nexT[j];
//二营长,你他娘的next数组呢
}
}
return k;
//返回字符数量
}
void hnext(string o,int o0){//寻找next数组
int j=0,k=-1;
nexT[j]=k;//先把next[0]变成-1
//如果第一个对上的数字就不对
//那么只动j是不可能找到成功的串的
//所以把他变成-1就是做一个信号
//让程序知道“我需要动i”这件事
while(j<o0){//数组不超限制是肯定的
if(k==-1||o[j]==o[k]){
nexT[++j]=++k;
//如果k是-1
//那么就证明前面连个屁的对应都没有
//甚至可能连字符都没有
//再往前倒腾也不太现实
//那就只能向后来一位
//即next[j+1]=k+1
//那如果我们现在看到的两个字符相同
//比如:
//A C D A C D C
// k j j+1
//那么前面是一一对应的
//就是k和k前面的东西
//和k+1~j的地方已经对过了
//能和k+1~j对上的主串部分
//就一定能和0~k的部分对上
//所以如果在j+1的地方出了岔子
//那就可以直接把0~k忽略
//直接k+1一步到位
//所以此时next[j+1]=k+1
}
else{
//如果不相等了
//比如:
//A B A C D A B A B C
// k j j+1
//每一个循环的宗旨都是求出next[j+1]
//所以j的位置不能动,但是还对不上
//所以就要单独动k
//也就是调整移动的长度
//这就需要我们调整开始的位置
//匹配长度会不可避免的变小
//但无论k怎么变
//它都会在我们已经对应好的串里
//通俗地说
//是在用前缀的前缀匹配后缀的后缀
//而在那个已经匹配出来的串子里
//是有一个更短也能100%对的缀的
//它的串尾的下标就是next[k]
//那直接让他滚过去不就得了
k=nexT[k];
}
}
}
int main(){
while(1){
cin>>t;//输入主串
if(t=="#"){//结束了
break;//再见
}
cin>>p;//输入子串
t0=t.size();
p0=p.size();
hnext(p,p0);//把对应的next找出来
printf("%d\n",KMP(t,t0,p,p0));
//算完输出
}
return 0;
}

016(剪花布条)(KMP)的更多相关文章
- HDU 2087 - 剪花布条 - [KMP算法]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...
- HDU 2087 剪花布条 (KMP 不允许重叠的匹配)
题目链接 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Inp ...
- hdu 2087剪花布条 (KMP入门 子串出现的次数和子串个数)
剪花布条 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- C - 剪花布条 (KMP例题)
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input输入中含有一些数据,分别是成对出现的花布条和 ...
- HDU 2087 剪花布条(字符串匹配,KMP)
HDU 2087 剪花布条(字符串匹配,KMP) Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出 ...
- (KMP)剪花布条 -- hdu -- 2087
http://acm.hdu.edu.cn/showproblem.php?pid=2087 剪花布条 Time Limit: 1000/1000 MS (Java/Others) Memory ...
- HDU 2087 剪花布条 (简单KMP或者暴力)
剪花布条 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP
题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...
- HDU-2087 剪花布条 字符串问题 KMP算法 查匹配子串
题目链接:https://cn.vjudge.net/problem/HDU-2087 题意 中文题咯 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条, ...
- 剪花布条 --HDOJ 2087
剪花布条 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
随机推荐
- JavaScript函数中的arguments对象
ECMAScript标准中,每个函数都有一个特殊的内置对象arguments.arguments对象是一个类Array对象(object),用以保存函数接收到的实参副本. 一.内置特性 说它是一个内置 ...
- IoT平台如何实现业务配置中心
摘要:本文讲述业务配置中心(下文简述为配置中心)的关键技术和实现方式. 本文分享自华为云社区<手把手教你物联网平台如何实现业务配置中心>,作者: 华为云IoT专家团 . 上一篇<华为 ...
- 【第六课】SHELL和计划任务(学习笔记)
4月15日学习笔记
- come on! 基于LinkedHashMap实现LRU缓存
/** * @Description 基于LinkedHashMap实现一个基于'LRU最近最少使用'算法的缓存,并且最多存MAX个值 * @Author afei * @date:2021/4/25 ...
- 动态SQL常用标签
动态 SQL 目的:为了摆脱在不同条件拼接 SQL 语句的痛苦 在不同条件在生成不同的SQL语句 本质上仍然是SQL语句,不过是多了逻辑代码去拼接SQL,只要保证SQL的正确性按照格式去排列组合 可以 ...
- 用c语言调用Easy X实现图像的输出,附带音乐的读取
要实现此功能需要用EasyX 一.下载VS编译环境和EasyX. ①Vs2019https://iwx.mail.qq.com/ftn/download?func=3&key=9e9b6c33 ...
- 渗透:zANTI
Zanti简介 Zanti是由Zimperium公司打造的Android平台下的渗透测试工具包. Zanti支持两种中间人攻击方式,分别为MIMT攻击和ARP攻击,中间人内带有多个攻击模块,例如MAC ...
- 标注工具doccano导出数据为空的解决办法
地址:https://github.com/taishan1994/doccano_export doccano_export 使用doccano标注工具同时导出实体和关系数据为空的解决办法.docc ...
- Python写安全小工具-TCP全连接端口扫描器
通过端口扫描我们可以知道目标主机都开放了哪些服务,下面通过TCP connect来实现一个TCP全连接端口扫描器. 一个简单的端口扫描器 #!/usr/bin/python3 # -*- coding ...
- Java高并发-Java内存模型和线程安全
一.原子性 原子性是指一个操作是不可中断的.即使在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰. i++是原子操作吗? 不是,包含3个操作:读i,i=i+1,写i 32位的机子上读取 ...