【KMP】剪花布条

KMP算法

又水了一题。算是巩固复习吧。

Problem Description

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

Input

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

Output

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

Sample Input

abcde a3
aaaaaa  aa
#

Sample Output

0
3

Author

qianneng

Source

冬练三九之二
 
 1 #include<iostream>
 2 #include<string.h>
 3 #include<stdio.h>
 4 using namespace std;
 5 char a[1005],b[1005];
 6 int Next[1005];
 7 
 8 void GetNext(int lb){
 9     int i=0,j=-1;
10     Next[0]=-1;
11     while(i<lb){
12         if(j==-1||b[i]==b[j]){
13             i++;j++;Next[i]=j;
14         }
15         else
16             j=Next[j];
17     }
18 }
19 
20 void KMP(int la,int lb){
21     int i=0,j=0,n=0;
22     while(i<la&&j<lb){
23         if(j==-1||a[i]==b[j]){
24             i++;j++;
25         }
26         else
27             j=Next[j];
28         if(j==lb){
29             n++;
30             j=0;    //注意j=0
31         }
32     }
33     cout<<n<<endl;
34 }
35 
36 int main()
37 {
38     int la,lb;
39     while(cin>>a&&a[0]!='#'){
40         cin>>b;
41         la=strlen(a);
42         lb=strlen(b);
43         GetNext(lb);
44         KMP(la,lb);
45     }
46     return 0;
47 }

 

posted on 2015-02-21 15:57  0Kelvin  阅读(165)  评论(0编辑  收藏  举报

导航