剪花布条 (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
原创粉丝点击