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位的默认为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 }
时间: 2025-01-02 04:23:09

hdu 2087 剪花布条 kmp模板题的相关文章

hdu 2087 剪花布条 KMP水题。。

剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10399    Accepted Submission(s): 6701 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入中含

HDU 2087 剪花布条 KMP题解

KMP的应用,不过查找的时候注意一点就够了:查找到一个子串的时候,直接跳过整个串,而不是使用next数组前跳,因为根据题意需要剪出小饰条,小饰条之间不能重叠. const int MAX_N = 1001; char txt[MAX_N], pat[MAX_N]; int next[MAX_N], len; void genNext() { for (int i = 1, j = 0; i < len; ) { if (pat[i] == pat[j]) next[i++] = ++j; els

HDU 2087 剪花布条 KMP入门

Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样.花纹条和小饰条不会超过1000个字符长.如果遇见#字符,则不再进行工作. Output 输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出

HDU 2087 剪花布条 KMP

题意:找文本串中模式串的个数 解题思路:裸KMP 解题代码: 1 // File Name: getnext.cpp 2 // Author: darkdream 3 // Created Time: 2014年09月09日 星期二 22时35分02秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #includ

题解报告:hdu 2087 剪花布条(KMP入门)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样.花纹条和小饰条不会超过1000个字符长.如果遇见#字符

HDOJ/HDU 2087 剪花布条(indexOf()应用~~)

Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样.花纹条和小饰条不会超过1000个字符长.如果遇见#字符,则不再进行工作. Output 输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出

剪花布条(kmp)

欢迎参加——每周六晚的BestCoder(有米!) 剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11258    Accepted Submission(s): 7220 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条

杭电---2087剪花布条

Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样.花纹条和小饰条不会超过1000个字符长.如果遇见#字符,则不再进行工作. Output 输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出

杭电OJ -- 2087 剪花布条

挺简单的一道题目! #include <iostream> #include <string> using namespace std; int main() { string str, short_str; while (cin >> str && str != "#") { cin >> short_str; string::size_type index = 0; int count = 0; while (1) {