剪花布条 (HDU_2087) KMP
来源:互联网 发布:java jdbc连接池配置 编辑:程序博客网 时间:2024/05/18 21:07
剪花布条
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 13780 Accepted Submission(s): 8751
Problem Description
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3aaaaaa aa#
Sample Output
03
Author
qianneng
题目大意:给出主串和模式串,求能够在主串中分离出多少模式串;
解题思路:KMP,在KMP函数中每当成功匹配,计数加一,j置为0;
代码如下:
#include"iostream"#include"cstdio"#include"cstring"using namespace std;const int maxn = 1000005;const int maxm = 10005;char s[maxn];int Next[maxm];void MakeNext(int m){Next[0] = -1;//-1 表示没有已匹配的串中没有符合要要求的 int i = 0,j = -1;//i表示主串的指针,j表示模式串的指针 while(i < m){//i不回溯,不断向后移动 if(j == -1 || p[i] == p[j]){ i ++ , j ++;//两串当前位置相等,比较下一位 if(p[i] != p[j]) Next[i] = j;else Next[i] = Next[j];}else j = Next[j];}}int KMP(int n,int m){int i = 0,j = 0,cnt = 0;while(i < n && j < m){if(s[i] == p[j] || j == -1){i ++,j ++;if(j == m){//成功匹配 cnt ++;j = 0;}}else j = Next[j];}return cnt;}int main(){int n,m,cas;while(cas --){scanf("%s",s);n = strlen(s);MakeNext(m);printf("%d\n",KMP(n,m));}return 0;}
0 0
- 剪花布条 (HDU_2087) KMP
- HDU_2087剪花布条
- 剪花布条 KMP
- 剪花布条 kmp
- 剪花布条(KMP)
- 2087 剪花布条【kmp】
- HDOJ2087 剪花布条(kmp)
- hdu2087 剪花布条--KMP
- HDU2087 剪花布条 [KMP]
- hdu2087 剪花布条 KMP
- hdu2087 剪花布条 kmp
- hdu2087剪花布条[KMP]
- hdu2087 剪花布条【kmp】
- HDU2087--剪花布条 (KMP)
- 剪花布条 (KMP)
- HDOJ 2087 剪花布条 [KMP]
- HDOJ 2087 剪花布条【KMP】
- HDU 2087 剪花布条 kmp
- sql经典题
- \r\n
- 欢迎使用CSDN-markdown编辑器
- lightoj 1213 - Fantasy of a Summation 【数学计数】
- 自定义标题栏的问题
- 剪花布条 (HDU_2087) KMP
- 和为s的两个数字VS和为s的连续证正数序列
- LocalBroadcastManager
- 动态规划
- 采药
- Android中ListView的几种常见的优化方法
- inieditor操作conf、ini文件新思路
- Android设计模式之23种设计模式一览
- 【1】Nginx安装方法