HDU 2087 减花布条(KMP 匹配)

来源:互联网 发布:cow数据库 编辑:程序博客网 时间:2024/06/05 09:56

题目:

Description

一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 

Input

输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。 

Output

输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。 

Sample Input

abcde a3aaaaaa  aa#

Sample Output

03

代码是从我之前写的代码复制过来的,只改了一点。点击打开链接

代码:

#include<iostream>#include<string.h>using namespace std;char listn[1005];//长串char listm[1005];//短串int next_[1005];void getnext(char *t, int m, int *next)//m是短串t的长度{int i = 1, j = 0;next[1] = 0;while (i < m){if (j == 0 || t[i] == t[j]){i++;j++;if (t[i] != t[j])next[i] = j;else next[i] = next[j];}else j = next[j];}}int main(){ios_base::sync_with_stdio(false);//减小输入输出的时间int n, m;int sum;while (1){cin >> listn;n = strlen(listn);if (n == 1 && listn[0] == '#')break;cin >> listm;m = strlen(listm);int i = 0, j = 0;sum = 0;getnext(listm, m, next_);while (i < n){if (listn[i] == listm[j]){i++;j++;if (j >= m){sum++;j = 0;}}else{if (next_[j])j = next_[j];else{i++;j = 0;}}}cout << sum << endl;}return 0;}


1 0
原创粉丝点击