HDU 2087 剪花布条

剪花布条

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 24909    Accepted Submission(s): 15362


Problem Description
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
 
Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
 
Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
 
Sample Input
abcde a3 aaaaaa aa #
 
Sample Output
0 3
 
Author
qianneng
 1 #include <iostream>
 2 #include <cstring>
 3 #include <string>
 4 #include <algorithm>
 5 using namespace std;
 6 int n;
 7 char a[1005];
 8 char b[1005];
 9 int nxt[1005];
10 int la, lb;
11 void get_nxt()
12 {
13     int i = 0;
14     int j = -1;
15     nxt[0] = -1;
16     while (i < lb)
17     {
18         if (j == -1 || b[i] == b[j]) nxt[++i] = ++j;
19         else j = nxt[j];
20     }
21 }
22 int main()
23 {
24     while (cin >> a)
25     {
26         if (a[0] == '#') break;
27         else cin >> b;
28         la = strlen(a);
29         lb = strlen(b);
30         get_nxt();
31         int i = 0, j = 0;
32         int s = 0;
33         while (i < la)
34         {
35             if (j == -1 || a[i] == b[j])
36             {
37                 i++;
38                 j++;
39             }
40             else j = nxt[j];
41             if (j == lb)
42             {
43                 s++;
44                 j = 0;//不是j=nxt[j],因为不能重复
45             }
46         }
47         cout << s << endl;
48     }
49     return 0;
50 }
 
原文地址:https://www.cnblogs.com/caiyishuai/p/8446357.html