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

hdu 2087 剪花布条 kmp模板题

时间:2016-10-31 22:02:03      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:time   created   cpp   ret   efi   处理   div   ems   pac   

也是kuangbin专题的 专题名字太长 不复制了……

刚好数据结构也学了kmp 找一道题敲敲模板……

暴力的字符串匹配是O(n*m)的时间复杂度

而kmp通过一个O(m)的预处理将字符串匹配的时间复杂度降到了O(n+m)

kmp的核心是next数组的处理和利用next数组进行字符串匹配

这两个理解了就会用kmp了

 1 /* ***********************************************
 2 Author        :Sun Yuefeng
 3 Created Time  :2016/10/31 19:02:08
 4 File Name     :kmp.cpp
 5 ************************************************ */
 6 
 7 #include<cstdio>
 8 #include<iostream>
 9 #include<algorithm>
10 #include<cmath>
11 #include<cstring>
12 #include<string>
13 #include<bitset>
14 #include<map>
15 #include<set>
16 #include<stack>
17 #include<vector>
18 #include<queue>
19 #include<list>
20 #define M(a,b) memset(a,b,sizeof(a))
21 using namespace std;
22 typedef long long ll;
23 const int inf=0x3f3f3f3f;
24 const int maxn=1005;
25 const int mod=1e7+7;
26 int dx[8]= {0,0,1,-1,1,-1,1,-1};
27 int dy[8]= {1,-1,0,0,-1,1,1,-1};
28 
29 char str[maxn];
30 char f[maxn];
31 int _next[maxn];
32 
33 /************************************
34 next数组的含义就是:
35 第0位的默认为0
36 以当前字符为结尾的字符串的最长公共前后缀长度
37 例如:
38 loc  0 1 2 3 4 5 6
39 str  A B C A B C D
40 next 0 0 0 1 2 3 0
41 *************************************/
42 
43 void kmp(char str[],int len) //预处理next数组
44 {
45     int i=0,j=-1;
46     _next[0]=-1;
47     while(i<len)
48     {
49         while(-1!=j&&str[i]!=str[j]) j=_next[j];
50         i++,j++;
51         _next[i]=j;
52     }
53 }
54 
55 int cnt(char x[],int lenx,char y[],int leny) //查找
56 {//x是模式串 y是主串
57     int i=0,j=0,ans=0;
58     M(_next,0);
59     kmp(f,strlen(f));
60     while(i<leny)
61     {
62         while(-1!=j&&y[i]!=x[j]) j=_next[j];
63         i++,j++;
64         if(j>=lenx)
65         {
66             ans++;
67             j=0;
68             //j=next[j];
69             //如果换成上面这句的话 模式串是可以重复的
70         }    
71     }
72     return ans;
73 }
74 
75 int main()
76 {
77     //freopen("in.txt","r",stdin);
78     //freopen("out.txt","w",stdout);
79     while(cin>>str)
80     {
81         if(str[0]==#) break;
82         cin>>f;
83         cout<<cnt(f,strlen(f),str,strlen(str))<<endl;
84     }
85     return 0;
86 }

 

hdu 2087 剪花布条 kmp模板题

标签:time   created   cpp   ret   efi   处理   div   ems   pac   

原文地址:http://www.cnblogs.com/general10/p/6017097.html

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