hdu 2087 剪花布条(kmp)
来源:互联网 发布:优酷客户端for mac 编辑:程序博客网 时间:2024/06/04 18:44
剪花布条
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 22616 Accepted Submission(s): 14142
Problem Description
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3aaaaaa aa#
Sample Output
03
KMP肯定是能想到,关键是如何每次匹配成功后,再从子串的开头开始匹配?
既然匹配过的串都剪掉了,那么匹配与匹配之间是没有交集的所以,直接让j=0,从子串开头匹配即可
如果匹配之间有交集,那么j=next[j]
#include<bits/stdc++.h>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;typedef long long ll;const int N=1005;int nxt[N];void get_nxt(string t){ int i=0,j=-1,len=t.size(); nxt[0]=-1; while(i<len) { if(j==-1||t[i]==t[j]) { nxt[++i]=++j; } else j=nxt[j]; }}void kmp(string s,string t){ get_nxt(t); int ans=0,i=0,j=0,la=s.size(),lb=t.size(); while(i<la) { if(j==-1||s[i]==t[j]) { ++i,++j; } else j=nxt[j]; if(j==lb)ans++,j=0;//若两个匹配之间有交集则j=next[j],无交集j=0 } printf("%d\n",ans);}int main(){ ios::sync_with_stdio(false); int n; string s,t; while(cin>>s) { if(s=="#")break; cin>>t; kmp(s,t); } return 0;}
阅读全文
0 0
- HDU 2087 剪花布条 kmp
- HDU 2087 剪花布条(KMP)
- HDU 2087 剪花布条 KMP
- hdu 2087 剪花布条(KMP)
- HDU 2087 剪花布条 裸KMP
- HDU 2087 剪花布条 KMP
- hdu 2087 剪花布条(KMP)
- HDU 2087 剪花布条(KMP)
- HDU 2087 剪花布条(KMP:贪心)
- HDU-2087 剪花布条(kmp)
- HDU 2087 剪花布条 KMP入门
- HDU 2087 剪花布条 //简单kmp
- hdu 2087 剪花布条 KMP
- HDU 2087 剪花布条 KMP题解
- hdu 2087 剪花布条(数据结构:KMP)
- hdu 2087 剪花布条 KMP
- HDU - 2087 剪花布条 (KMP)
- hdu 2087 剪花布条 KMP
- 第一篇 hello world
- 一行文字居中多行文字左对齐
- vue悬停下拉菜单(视频门户网站)
- unity5.6新功能VideoPlayer播放声音,判断视频播放完毕,以及遇到的坑总结
- jsp提交表单的方法
- hdu 2087 剪花布条(kmp)
- vue生命周期和钩子函数的理解
- OpenCV2编程手册笔记之 10.3处理视频帧
- spark中的几个概念File,Block,Split,Task,Partition,RDD以及节点数、Executor数、core数目的关系。
- Vue组件间通信方式
- 新ListView多条目加载 4个(重要)
- zendframework2配置Module
- 超级台阶
- azkaban源码解读