HDU-2087 剪花布条 ( kmp )

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2087

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

 

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

 

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

 

Sample Input
abcde a3
aaaaaa aa
#
 

 

Sample Output
0
3
 
kmp模板题,直接上代码
 
 1 #include<iostream>
 2 #include<cstring>
 3 #include<string>
 4 using namespace std;
 5 
 6 string mstr;
 7 string zstr;
 8 int same[1005];
 9 
10 void makesame(){
11     memset( same, 0, sizeof( same ) );
12 
13     int p, k = 0;
14 
15     for( p = 1; p < zstr.size(); ){
16         while( k > 0 && zstr[p] != zstr[k] )
17             k = same[k];
18         if( zstr[p] == zstr[k] ) k++;
19         same[++p] = k;
20     }
21 }
22 
23 int kmp(){
24     int ans = 0;
25 
26     int p = 0;
27     for( int i = 0; i < mstr.size(); i++ ){
28         while( p > 0 && mstr[i] != zstr[p] )
29             p = same[p];
30         if( mstr[i] == zstr[p] ) p++;
31         if( p == zstr.size() ){
32             ans++;
33             p = 0;
34         }
35     }
36     
37     return ans;
38 }
39 
40 int main(){
41     ios::sync_with_stdio( false );
42     
43 
44     while( cin >> mstr, mstr != "#" ){
45         cin >> zstr;
46         makesame();
47         int ans = kmp();
48         cout << ans << endl;
49     }
50 
51     return 0;
52 }

 

posted @ 2016-04-14 17:39  「空白」物语  阅读(293)  评论(0编辑  收藏  举报