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 ...
随机推荐
- 使用 VS Code 撰写 Markdown 文档
众所周知, VS Code 是微软和社区一起开发的一款很优秀的高级代码编辑器.它不仅可以写出一手好代码,还能写出一篇好文章.利用 Markdown 就可以写出一篇排版美观的技术文章了. 而 Markd ...
- Linux常用命令学习笔记——基于CentOS 7
前言:最近在linux培训时复习了一下linux系统中一些常用的命令和用法,整理成了笔记,虽然些许零散,但希望对大家有所帮助. 目录 0.帮助指令 1.关机.重启.注销命令 2.文件和目录操作命令 3 ...
- springmvc03-restful和控制器
一.控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现. 控制器负责解析用户的请求并将其转换为一个模型. 在Spring MVC中一个控制器类可以包含 ...
- Bugku CTF练习题---加密---凯撒部长的奖励
Bugku CTF练习题---加密---凯撒部长的奖励 flag:SYC{here_Is_yOur_rEwArd_enjOy_It_Caesar_or_call_him_vIctOr_is_a_Exc ...
- 修改本地仓库Maven,设置镜像
修改本地仓库的位置: 先建立 文件路径: 进入文件夹目录: 就可以看到一个配置文件夹 就在里面修改本地仓库的路径,设置阿里云镜像 添加本地阿里云镜像: 如下图: 内容如下: <mirror> ...
- mysql内连接查询之自连接
连接查询: 当查询数据时,通过连接操作查询出存放在多个表中的不同数据,当两个或者多个表中存在相同意义的字段时, 便可以通过这些字段对不同的表进行连接查询. 自连接: 如果在一个连接查询中,涉及的两个表 ...
- Linux 或 Windows 上实现端口映射
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 通常服务器会有许多块网卡,因此也可能会连接到不同的网络, ...
- Android添加背景图片和设置app图标
Android添加背景图片和设置app图标 Android 添加背景图片 第一步:找到你要当做背景的图片,并下载下来 第二步:将图片复制到app->res->mipmap文件夹下 第三步: ...
- .NET混合开发解决方案16 管理WebView2的用户数据
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
- 一文带你读懂 Hbase 的架构组成
hi,大家好,我是大D.今天咱们继续深挖一下 HBase 的架构组成. Hbase 作为 NoSQL 数据库的代表,属于三驾马车之一 BigTable 的对应实现,HBase 的出现很好地弥补了大数据 ...