HDU2087 剪花布条
来源:互联网 发布:xp找不到网络路径 编辑:程序博客网 时间:2024/05/22 04:53
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=2087
题目
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3
aaaaaa aa
#
Sample Output
0
3
题解
kmp的多次运用。
(1)将花布条看作主串,小饰条看作模式串
(2)对主串和模式串调用一次kmp算法
(2.1)如果成功匹配,则ans++,将花布条剪去匹配的部分,转(1)
(2.2)匹配失败,程序结束
(3)输出ans
代码
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=1e3+100;char t[maxn],s[maxn];int pre[maxn],ans,len,n;void getpre(){ memset(pre,0,sizeof(pre)); int j=0; for(int i=2;i<=len;i++) { while(j>0 && t[j+1]!=t[i]) j=pre[j]; if(t[j+1]==t[i]) j++; pre[i]=j; }}int kmp(){ ans=0; int j=0; for(int i=1;i<=n;i++) { while(j>0 && t[j+1]!=s[i]) j=pre[j]; if(t[j+1]==s[i]) j++; if(j==len) { j=0; ans++; } } return ans;}int main(){ while(scanf("%s",s+1)) { if(strcmp(s+1,"#")==0) break; scanf("%s",t+1); len=strlen(t+1); n=strlen(s+1); getpre(); printf("%d\n",kmp()); } return 0;}
阅读全文
0 0
- hdu2087-剪花布条
- hdu2087 剪花布条
- HDU2087 剪花布条
- hdu2087 剪花布条
- hdu2087 剪花布条
- HDU2087 剪花布条
- hdu2087剪花布条
- HDU2087 剪花布条
- HDU2087剪花布条
- HDU2087 剪花布条
- HDU2087 剪花布条
- hdu2087剪花布条
- HDU2087剪花布条
- HDU2087-剪花布条
- hdu2087剪花布条
- hdu2087剪花布条
- HDU2087 剪花布条
- HDU2087剪花布条
- goeasy+jquery+ckplayer实现动态实时视频弹幕
- servlet生命周期
- qml开发笔记
- servlet的config
- StyleWriter英文润色软件使用说明(含破解安装包)
- HDU2087 剪花布条
- IDEA——创建Maven Web工程
- 使用注解操作redis中的缓存
- 一起Talk Android吧(第五十五回:Android中的Fragment显示与隐藏二)
- openOCD 配置和使用 (英文)
- Presto-[10]-Administration-Spill to Disk
- mac下安装pip和Scikit-learn
- JAVA Map 遍历Map 集合 map 的嵌套
- STM32F769I-DISCO开发板功能简介