hdu_2087 剪花布条(kmp)
剪花布条
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15228 Accepted Submission(s): 9646
Problem Description
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3
aaaaaa aa
#
Sample Output
0
3
Author
qianneng
简单的kmp
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N = 1005; 6 char a[N],b[N]; 7 int Next[N]; 8 int kmp(char *a,char *b) 9 { 10 int len1 = strlen(a); 11 int len2 = strlen(b); 12 //求Next 13 int j = 0; 14 int tm = Next[0] = -1; 15 while(j<len2-1){ 16 if(tm<0||b[j]==b[tm]) { 17 Next[++j] = ++tm; 18 } 19 else tm = Next[tm]; 20 } 21 /* for(int i = 0; i < len2; i++) 22 printf("%d ",Next[i]); 23 puts(""); 24 */ 25 //匹配 26 int i; 27 int ans = 0; 28 for(i = j = 0; i < len1; ){ 29 if(j==len2) {ans++; i--;j= -1;} 30 if(j<0||a[i]==b[j]) i++,j++; 31 else j = Next[j]; 32 } 33 if(i==len1&&j==len2) ans++; 34 return ans; 35 } 36 int main() 37 { 38 while(1) 39 { 40 scanf("%s",a); 41 if(a[0]=='#') return 0; 42 getchar(); 43 scanf("%s",b); 44 int ans = kmp(a,b); 45 46 // puts("haha"); 47 printf("%d\n",ans); 48 } 49 return 0; 50 }