HDU-2087 剪花布条 (KMP)

题目:

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

Input

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

Output

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

Sample Input

abcde a3
aaaaaa aa
#

Sample Output

0
3

模板题,每次匹配成功后计数并初始化子串指针即可。

Code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 void InitNext(string T, int *next){
 5     int i = 1, j = 0;
 6     next[1] = 0;
 7     while(i < T.size())
 8         if (j == 0 || T[i-1] == T[j-1]){
 9             ++i;
10             ++j;
11             next[i] = j;
12         }
13         else
14             j = next[j];
15 }
16 
17 int IndexKMP(string S, string T, int pos){
18     int i = pos;
19     int j = 1;
20     int next[255], ans = 0;
21     InitNext(T, next);
22     while(i <= S.size()){
23         if (j == 0 || S[i-1] == T[j-1]){
24             ++i;
25             ++j;
26         }
27         else
28             j = next[j];
29         if (j > T.size()){
30             ++ans;
31             j = 1;
32         }
33     }
34     return ans;
35 }
36 
37 int main()
38 {
39     string S, T;
40     while(cin>>S){
41         if (S[0] == '#') break;
42         cin>>T;
43         int ans = IndexKMP(S, T, 1);
44         cout<<ans<<endl;
45     }
46     return 0;
47 }

 

posted @ 2017-01-09 18:53  Robin!  阅读(101)  评论(0编辑  收藏  举报