ProblemC 剪花布条(KMP基础)

 

C - 剪花布条
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

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

Input

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

Output

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

Sample Input

abcde a3 aaaaaa aa #
 

Sample Output

0 3
 

 

 

题目大意:

  就是说,给你一个文本串,给你一个模式串,然后让你求出模式串在文本串中出现了多少次,注意,不能有重叠.
解题思路:

  把在文本串中找模式串的程序稍微修改下,就A了,把t2=next[t2] 改为0,就好了。

  

代码:

 1 # include<cstdio>
 2 # include<iostream>
 3 # include<cstring>
 4 
 5 using namespace std;
 6 
 7 # define MAX 1234
 8 
 9 char s1[MAX];
10 char s2[MAX];
11 int nxt[MAX];
12 
13 void get_nxt()
14 {
15     int len = strlen(s2);
16     int t1 = 0,t2;
17     t2 = nxt[0] = -1;
18     while ( t1 < len )
19     {
20         if ( t2==-1||s2[t1]==s2[t2] )
21         {
22             t1++;t2++;
23             nxt[t1] = t2;
24         }
25         else
26             t2 = nxt[t2];
27     }
28 }
29 
30 int kmp()
31 {
32     int len1 = strlen(s1), len2 = strlen(s2);
33     int t1 = 0,t2 = 0;
34     int times = 0;
35     while ( t1<len1 )
36     {
37         if ( t2==-1||s1[t1]==s2[t2] )
38         {
39             t1++;t2++;
40         }
41         else
42             t2 = nxt[t2];
43         if ( t2==len2 )
44         {
45             times+=1;
46             t2 = 0;
47         }
48     }
49     return times;
50 }
51 
52 int main(void)
53 {
54     while ( scanf("%s%s",s1,s2) )
55     {
56         if ( s1[0]=='#' )
57             break;
58         get_nxt();
59         int ans = kmp();
60         printf("%d\n",ans);
61     }
62 
63     return 0;
64 }

 

posted @ 2015-05-30 14:31  BYYB_0506  阅读(259)  评论(0编辑  收藏  举报