剪花布条
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6966 Accepted Submission(s): 4643
Problem Description
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3
aaaaaa aa
#
Sample Output
0 3
思路: KMP
AC代码:
1 #include<stdio.h> 2 #include<string.h> 3 char a[1005], b[1005]; 4 int fail[1005]; 5 int lena, lenb; 6 int cnt; 7 void getfail() 8 { 9 fail[0] = -1; 10 int i, j; 11 for(i = 1, j = -1; i < lenb; i ++) 12 { 13 while(j >= 0 && b[j + 1] != b[i]) 14 { 15 j = fail[j]; 16 } 17 if(b[j + 1] == b[i]) 18 j ++; 19 fail[i] = j; 20 } 21 return ; 22 } 23 24 void kmp() 25 { 26 getfail(); 27 int i, j; 28 for(i = 0, j = 0; i < lena; i ++) 29 { 30 while(j && b[j] != a[i]) 31 { 32 j = fail[j - 1] + 1; 33 } 34 if(b[j] == a[i]) 35 j ++; 36 if(j == lenb) 37 { 38 cnt ++; 39 if(i + lenb < lena) 40 j = 0; 41 else 42 return ; 43 } 44 } 45 } 46 int main(int argc, char const *argv[]) 47 { 48 freopen("in.c","r",stdin); 49 while(~scanf("%s", a) && strcmp(a, "#")) 50 { 51 scanf("%s", b); 52 lena = strlen(a); 53 lenb = strlen(b); 54 cnt = 0; 55 kmp(); 56 printf("%d ", cnt); 57 memset(a, 0, sizeof(a)); 58 memset(b, 0, sizeof(b)); 59 } 60 return 0; 61 }