题目:
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
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 }