两种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开发中,用户能够拨打电话是最基本的需求.俗话说“条条大路通罗马”,实现拨打电话的方式有多种,今天,就提供最常用两种. 首先,拨打电话,对于用户来说,是一个耗费的操作,因此,需要一定权限 ...
随机推荐
- 如何将SAP Multi Target应用部署到SAP云平台的Cloud Foundry环境去
SHINA是SAP HANA Interactive Education的缩写,是一个demo应用,用于演示如何开发SAP HANA原生应用. 这个应用包含了sample数据以及HANA数据库表,vi ...
- EF生成的实体映射含义
如图: 组合效果: LEFT JOIN 效果: this.HasOptional(t => t.子表) .WithMany(t => t.主表) .HasForeignKey(d => ...
- 字符编码ANSI和ASCII区别、Unicode和UTF-8区别
ANSI码ANSI编码是一种对ASCII码的拓展:ANSI编码用0x00~0x7f (即十进制下的0到127)范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示 ...
- python_106_创建类的两种方式
class Foo(object): def __init__(self, name): self.name = name f = Foo("alex") print(type(f ...
- 安装JDK1.8以及配置环境变量的步骤
一. 首先到官网下载jdk1.8,下载的版本分为windows和linux,这里需要安装操作系统进行下载.我的是64位就下载x64,32位系统则下载x86 二. 然后就是安装,双击进行安装,这里不用更 ...
- javaweb基础(19)_jsp标签
一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...
- Luogu P1666 前缀单词
校内资格赛题目,差点高一就要\(\tt{AFO}\)了 30分思路 对30%的数据,满足$1≤n≤10 $ 所以我们可以子集枚举,实际得分40pts #include<iostream> ...
- angular5 HttpInterceptor使用
HttpInterceptor接口是ng的http请求拦截器,当需要拦截http请求,可以实现该接口. 1.创建HttpInterceptor 的实现类,并使用@Injectable()注解 @Inj ...
- paper:synthesizable finite state machine design techniques using the new systemverilog 3.0 enhancements 之 standard verilog FSM conding styles(二段式)
1.Two always block style with combinational outputs(Good Style) 对应的代码如下: 2段式总结: (1)the combinational ...
- DAOMYSQLI工具类
<?php //DAOMySQLI.class.php //完成对mysql数据库操作,单例模式 //开发类 //1. 定类名 //2. 定成员属性 //3. 定成员方法[查询,dml操作] f ...