两种KMP题+KMP模版整理
最近稍微看了下KMP,不是很懂他们大神的A题姿势,但是模版总该还是要去学的。
其中next数组的求法有两处区别。
第一种:求主串中模式串的个数。HDU2087 剪花布条和HDU4847 Wow! Such Doge!。这两道都比较水可以暴力string::find函数过,
第一个代码:
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long LL;
int nextval[101010];
void getnext(char s[],int next[])
{
int j=0,k=next[0]=-1;
int len=strlen(s);
while (j<len-1) //
{
if(k==-1||s[k]==s[j])
{
j++;
k++;
next[j]=next[k]; //
}
else
k=next[k];
}
}
int sea(char s[],char t[])
{
int cnt=0;
int i=0,j=0;
int la=strlen(s),lb=strlen(t);
while (i<la&&j<lb)
{
if(j==-1||s[i]==t[j])
{
i++;
j++;
}
else
j=nextval[j];
if(j==lb)
{
cnt++;
j=nextval[j];
}
}
return cnt;
}
int main(void)
{
char a[1010]={0},b[1010]={0};
while (cin>>a)
{
if(strcmp(a,"#")==0)
{
break;
}
cin>>b;
memset(nextval,0,sizeof(nextval));
getnext(b,nextval);
cout<<sea(a,b)<<endl;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}
return 0;
}
后一题代码:
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long LL;
int nextval[101010];
void getnext(char s[],int nextval[])
{
int j=0,k=-1;
nextval[0]=-1;
int lenp=strlen(s);
while(j<lenp-1) //
{
if(k==-1||s[j]==s[k])
{
k++;
j++;
nextval[j]=nextval[k];//
}
else
k=nextval[k];
}
}
int sea(char s[],char t[])
{
int cnt=0;
int i=0,j=0;
int la=strlen(s),lb=strlen(t);
while (i<la&&j<lb)
{
if(j==-1||s[i]==t[j])
{
i++;
j++;
}
else
j=nextval[j];
if(j==lb)
{
cnt++;
j=nextval[j];
}
}
return cnt;
}
void change(char a[])
{
int len=strlen(a);
for (int i=0; i<len; i++)
{
a[i]=tolower(a[i]);
}
}
int main(void)
{
char a[1000010]={0},b[]="doge";
getnext("doge",nextval);
int cntt=0;
while (gets(a)!=NULL)
{
change(a);
cntt+=sea(a,b);
memset(a,0,sizeof(a));
}
printf("%d\n",cntt);
return 0;
}
第二种:求子串出现个数,比如abababa aba 要是按第一种求法,这个答案会是2,但出现次数不是个数,因此答案是3。例题为POJ 3461
代码:
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long LL;
int nextval[101010];
void getnext(char s[],int nextval[])
{
int j=0,k=-1;
nextval[0]=-1;
int lenp=strlen(s);
while(j!=lenp) //
{
if(k==-1||s[j]==s[k])
nextval[++j]=++k; //
else
k=nextval[k];
}
}
int sea(char s[],char t[])
{
int cnt=0;
int i=0,j=0;
int la=strlen(s),lb=strlen(t);
while (i<la&&j<lb)
{
if(j==-1||s[i]==t[j])
{
i++;
j++;
}
else
j=nextval[j];
if(j==lb)
{
cnt++;
j=nextval[j];
}
}
return cnt;
}
int main(void)
{
char a[1000010]={0},b[1000010]={0};
int tcase;
scanf("%d",&tcase);
while (tcase--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(nextval,0,sizeof(nextval)); scanf("%s%s",b,a);
getnext(b,nextval);
printf("%d\n",sea(a,b));
}
return 0;
}
至于为什么可以这么玩,让我补完作业再慢慢研究
两种KMP题+KMP模版整理的更多相关文章
- DTcms同一频道需要两种类型的列表模版思路
放两个列表模版即可,两个模版下的内容都可以访问,同一个内容展示不同的模版,需要什么栏目,链接就写哪个. 对动态链接进行判断,选择 最终效果: 频道URL配置
- 串的两种模式匹配方式(BF/KMP算法)
前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最重要的操作之一,而不同的算法实现有着不同的 ...
- 经典算法题每日演练——第七题 KMP算法
原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...
- http与websocket(基于SignalR)两种协议下的跨域基于ASP.NET MVC--竹子整理
这段时间,项目涉及到移动端,这就不可避免的涉及到了跨域的问题.这是本人第一次接触跨域,有些地方的配置是有点麻烦,导致一开始的不顺. 至于websocket具体是什么意义,用途如何:请百度. 简单说就是 ...
- 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap
不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...
- [整理] C#调用SQLDMO.DLL时间数据库备份 / 还原。 (香神无涯) // C#实现SQLSERVER2000数据库备份还原的两种方法 (带进度条)
/// <summary>/// 通过调用MSSQL的SQLDMO.DLL文件来实现备份数据库/// 1.首先在在项目中引用SQLDMO.DLL文件./// 2.在引用中的SQLDMO.D ...
- 计算机二级-C语言-程序设计题-190111记录-两种指针赋值的不同,普通输入输出函数和文件输入输出函数的使用
//程序设计题:函数fun的功能是:将两位数的正整数a,b合并形成一个整数放在c中.合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上,b数的十位和个位数依次放在c数的十位和千位上.例如:当 ...
- 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)
[Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...
- android 一题多改系列——android 打电话实现两种方法
在android开发中,用户能够拨打电话是最基本的需求.俗话说“条条大路通罗马”,实现拨打电话的方式有多种,今天,就提供最常用两种. 首先,拨打电话,对于用户来说,是一个耗费的操作,因此,需要一定权限 ...
随机推荐
- [大坑]Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
报错tensorflow/stream_executor/cuda/cuda_dnn.cc:338] Could not create cudnn handle: CUDNN_STATUS_INTER ...
- 《队长说得队》【Alpha】Scrum meeting 3
项目 内容 这个作业属于哪个课程 >>2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 >>实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 ...
- JavaScript深入浅出第2课:函数是一等公民是什么意思呢?
摘要: 听起来很炫酷的一等公民是啥? <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函 ...
- c#和Java中的抽象类
应用场景:当父类中的方法不知道如何去实现的时候,可以考虑将父类写成抽象类,将方法写成抽象方法. 比如:描述一个图形.圆形. 矩形三个类.不管哪种图形都会具备计算面积与周长的行为,但是每种图形计算的方式 ...
- 基于matlab的蓝色车牌定位与识别---分割
接着上面的工作,接下去就该是进行字符分割了.考虑到为了后面的字符识别,因此在这部分需要实现的目标是需要把车牌的边框全部切除,对重新定位的车牌进行垂直方向水平方向调整,保证字符是正的.最后才是字符的分割 ...
- python入门:BREAK 的用法 跳当前循环后,不再执行下面代码块
#!/urs/bin/env python # -*- coding:utf-8 -*- # BREAK 的作用 跳当前循环后,不再执行下面代码块 while True: ') break ') #w ...
- 使用Spring MVC后实现一个BaseController
使用Spring MVC技术后,可以实现一个基类的Controller类来分装一些MVC常用的方法,其他的Controller都继承自这个BaseController,这样在使用常用的方法时将会变得非 ...
- 我的Python分析成长之路7
类 一.编程范式: 1.函数式编程 def 2.面向过程编程 (Procedural Programming) 基本设计思路就是程序一开始是要着手解决一个大的问题,然后把一个大问题分解成很多个 ...
- Linux学习-透过 systemctl 管理服务
透过 systemctl 管理单一服务 (service unit) 的启动/开机启动与观察状态 一般来说,服务的启动有两个阶段,一 个是『开机的时候设定要不要启动这个服务』, 以及『你现在要不要启动 ...
- Linux学习-什么是例行性工作排程
那么 Linux 的例行性工作是如何进行排程的呢?所谓的排程就是将这些工作安排执行的流程之意! 咱们的 Linux 排程就是透过 crontab 与 at 这两个东西! Linux 工作排程的种类: ...