hdoj 2087 剪花布条 【kmp(变形题)】
2015-09-03 22:32
309 查看
剪花布条
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11630 Accepted Submission(s): 7478
[align=left]Problem Description[/align]
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
[align=left]Input[/align]
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
[align=left]Output[/align]
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
[align=left]Sample Input[/align]
abcde a3 aaaaaa aa #
[align=left]Sample Output[/align]
0 3
[align=left]Author[/align]
qianneng
[align=left]Source[/align]
冬练三九之二
思路:
就是和模板kmp相差了一个当j==lenb的时候,需要将cnt++,之后将j的值置为0,因为它有可能是子串中有循环的子串,会使答案错误!(例如:aaaaaa aa)会输出5,而正确答案是3!
代码:
#include <stdio.h> #include <string.h> char a[1005]; char b[1005]; int p[1005]; int lena,lenb; int cnt; void getp() { int i=0,j=-1; p[0]=-1; while(i<lenb) { if(j==-1||b[i]==b[j]) { i++;j++; p[i]=j; } else j=p[j]; } } void kmp() { getp(); int i=0,j=0; while(i<lena) { if(j==-1||a[i]==b[j]) { i++;j++; if(j==lenb) { cnt++; j=0;//这一点要注意,就是害怕子串中有循环! } } else j=p[j]; } printf("%d\n",cnt); } int main() { while(scanf("%s",a)&&a[0]!='#') { scanf("%s",b); cnt=0; lena=strlen(a); lenb=strlen(b); kmp(); } }
相关文章推荐
- ZFS Architecture Description
- 谱聚类的增量更新原理
- npm的使用技巧 (nodejs 的版本管理 及常用命令 )
- Android test---JUnit
- DMA数据处理采用连续内存
- (linux命令学习)找到相应性质的文件并删除
- GCD队列的注意事项
- 自制51单片机最小系统
- hdu 2871(区间合并)
- 逆向工程核心原理学习笔记2-基址重定位基本原理
- Java冒泡排序法
- 关于phpStudy测试php时遇到解析不了的解决办法
- newssoj1005监听还原 recover(kmp)
- UVA 11491
- Python 集合set
- Quartz.net Cron表达式
- 著名的黑客站点
- 在python3中使用urllib.request编写简单的网络爬虫
- random函数
- BZOJ 1059 矩阵游戏 (二分图最大匹配)