码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 2087 (KMP不可重叠的匹配) 花布条

时间:2014-11-20 06:52:11      阅读:333      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   on   

题意:

用两个字符串分别表示布条和图案,问能从该布条上剪出多少这样的图案。

分析:

毫无疑问这也是用KMP匹配,关键是一次匹配完成后,模式串应该向后滑动多少。

和上一题 HDU 1686 不同,两个图案肯定不能在母串中有交叉的部分,所以当匹配成功一次后,应当滑动整个模式串的长度。

和上一题比,代码几乎不变,只是

j = next[j]; 变为 j = 0;

bubuko.com,布布扣
 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 const int maxn = 1000 + 10;
 5 char p[maxn], q[maxn];
 6 int next[maxn]; 
 7 
 8 void get_next(char* p, int l)
 9 {
10     int j = 0, k = -1;
11     next[0] = -1;
12     while(j < l)
13     {
14         if(k == -1 || p[k] == p[j])
15         {
16             k++;
17             j++;
18             next[j] = k;
19         }
20         else k = next[k];
21     }
22 }
23 
24 int KMP(char* p, int lenp, char* q, int lenq)
25 {
26     int i = 0, j = 0, ans = 0;
27     while(i < lenp)
28     {
29         if(j == -1 || p[i] == q[j])
30         {
31             i++;
32             j++;
33         }
34         else j = next[j];
35         if(j == lenq)
36         {
37             ans++;
38             j = 0;
39         }
40     }
41     return ans;
42 }
43 
44 int main(void)
45 {
46     //freopen("2087in.txt", "r", stdin);
47     
48     while(scanf("%s", p) == 1)
49     {
50         if(p[0] == #) break;
51         
52         memset(next, 0, sizeof(next));
53         scanf("%s", q);
54         int lenp = strlen(p);
55         int lenq = strlen(q);
56         get_next(q, lenq);
57         printf("%d\n", KMP(p, lenp, q, lenq));
58     }
59     
60     return 0;
61 }
代码君

 

HDU 2087 (KMP不可重叠的匹配) 花布条

标签:style   blog   http   io   ar   color   os   sp   on   

原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/4109678.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!