剪花布条【HDOJ2087】

2024-03-04 17:18
文章标签 剪花 布条 hdoj2087

本文主要是介绍剪花布条【HDOJ2087】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接
解题思路:这是KMP算法模板的应用。需要注意的地方就是,这里的子串需要重新取,所以对于j的处理时要改变一下。

版本1

#include <cstdio>
#include <cstring>
#include <cstdlib>
const int maxn = 1010;
int next[maxn];
char str[maxn],pat[maxn];
void getNext(char s[],int len){int j=-1;next[0]=-1;for(int i =1;i<len;i++){while(j!=-1&&s[i]!=s[j+1]){j=next[j];}if(s[i]==s[j+1]){j++;}next[i]=j;}
} 
//统计pattern串在text串中出现的次数
int KMP(char text[],char pattern[]){int n=strlen(text);int m=strlen(pattern);getNext(pattern,m);int ans = 0,j=-1;for(int i=0;i<n;i++){while(j!=-1&&text[i]!=pattern[j+1]){j=next[j];}if(text[i]==pattern[j+1]){j++;}if(j==m-1){ans++;j=next[0];}}return ans;
} 
int main(){while(scanf("%s",str)!=EOF&&str[0]!='#'){scanf("%s",pat);memset(next,0,sizeof(next));int tmp=KMP(str,pat);printf("%d\n",tmp);}return 0;
}

版本2

根据左神进阶视频讲解改写而成,十分感谢左神,终于让我弄懂了KMP算法。

#include<cstdio>
#include<cstring>
using namespace std;
char str1[1005],str2[1005];
int next[1005];
void getNext(char str[],int len){int i=2,cn=0;next[0]=-1;next[1]=0;while(i<len){if(str[i-1]==next[cn]) next[i++] = ++cn;else if(cn > 0) cn = next[cn];else next[i++] = 0;}
}
int main(){while(scanf("%s",str1)&&str1[0]!='#'){scanf("%s",str2);int len1 = strlen(str1);int len2 = strlen(str2);int j=0,i=0,cnt=0;getNext(str2,len2);while(i<len1){if(str1[i] == str2[j]){i++; j++;}else{ //甲乙没配上,则乙往右推 if(next[j]==-1){ //推不动了,乙已经在0位置了,则只能让甲移动 i++; }else{ //乙还能推,则推到j的最长前缀的下一个位置 j = next[j];  } }if(j == len2){ //说明已经匹配上str2了,但是还要继续找 j=0;cnt++;} }printf("%d\n",cnt);}return 0;
}

这篇关于剪花布条【HDOJ2087】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/773876

相关文章

杭电2087 剪花布条

跟1711一样的kmp入门题目 #include<stdio.h> #include<string.h> char s[1111],t[1111]; int next[1111],len1,len2; void getnext() { int i=1,j=0; next[1]=0; while(i<len2) { if(j==0||t[i]==t[j])

每日OJ_牛客_剪花布条(string内置函数)

目录 牛客_剪花布条(string内置函数) 解析代码 牛客_剪花布条(string内置函数) 剪花布条__牛客网 解析代码         题意就是在S串中,T串整体出现了多少次。C语言可以通过strstr函数找,用STL的string库可以通过find函数找,找到以后跳过一个T串的长度。         例如:在 abcacbcbcabscbc中找cbc,第一次找

【C/C++笔试练习】DNS设置文件、应用层、Dos攻击、DNS服务、DNS、子网划分、http状态、路由设置、TCP连接、HTTP状态码、剪花布条、客似云来

文章目录 C/C++笔试练习选择部分(1)DNS设置文件(2)应用层(3)Dos攻击(4)DNS服务(5)DNS(6)子网划分(7)http状态(8)路由设置(9)TCP连接(10)HTTP状态码 编程题 day33剪花布条客似云来 C/C++笔试练习 选择部分 (1)DNS设置文件   /etc/resolv.conf的用途是   A.邮件服务的设置文件   B.DHC

剪花布条 HDU - 2087(KMP多少个不重叠子串)

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

【每日一题】剪花布条

【每日一题】剪花布条 文章目录 【每日一题】剪花布条1、题目来源2、题目描述3、输入/出描述4、示例5、解题思路6、代码展示 1、题目来源   牛客网:剪花布条 2、题目描述   一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 3、输入/出描述   输入描述:

hdu2087剪花布条[KMP]

剪花布条 TimeLimit: 1000/1000 MS (Java/Others)    Memory Limit:32768/32768 K (Java/Others) Total Submission(s):16662    Accepted Submission(s): 10565 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里

HDU 2087 剪花布条 (kmp模板题)

剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27131    Accepted Submission(s): 16613 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小

HDOJ 2087 剪花布条 (调试暑期小练习)

剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 14746    Accepted Submission(s): 9337 Problem Description 一块花布条,里面有些图案,另有一块直接可用

KMP算法及应用(hdu2087剪花布条 )Power Strings (POJ2046)Cyclic Nacklace(HDU3746)

KMP由Knuth(D.E.Knuth)、Morris(J.H.Morris)和Pratt(V.R.Pratt)三人设计的线性时间字符串匹配算法。所以叫做KMP。。。。。 字符串匹配,就是从一个字符串中查找出另一个字符串所在位置,当然也可能出现查询不到的情况。 比如给出目标字符串 ss: abcabcabce 所要匹配的模式串 s: abcabce 当匹配到前6位是,都是成功的,但

HDU 2087 剪花布条(KMP 三种做法)

剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3083    Accepted Submission(s): 2079 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一