首页 > 代码库 > hdu 2087 剪花布条 kmp模板题
hdu 2087 剪花布条 kmp模板题
也是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位的默认为036 以当前字符为结尾的字符串的最长公共前后缀长度37 例如:38 loc 0 1 2 3 4 5 639 str A B C A B C D40 next 0 0 0 1 2 3 041 *************************************/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模板题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。