最近稍微看了下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模版整理的更多相关文章

  1. DTcms同一频道需要两种类型的列表模版思路

    放两个列表模版即可,两个模版下的内容都可以访问,同一个内容展示不同的模版,需要什么栏目,链接就写哪个. 对动态链接进行判断,选择 最终效果: 频道URL配置

  2. 串的两种模式匹配方式(BF/KMP算法)

    前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最重要的操作之一,而不同的算法实现有着不同的 ...

  3. 经典算法题每日演练——第七题 KMP算法

    原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...

  4. http与websocket(基于SignalR)两种协议下的跨域基于ASP.NET MVC--竹子整理

    这段时间,项目涉及到移动端,这就不可避免的涉及到了跨域的问题.这是本人第一次接触跨域,有些地方的配置是有点麻烦,导致一开始的不顺. 至于websocket具体是什么意义,用途如何:请百度. 简单说就是 ...

  5. 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  6. [整理] C#调用SQLDMO.DLL时间数据库备份 / 还原。 (香神无涯) // C#实现SQLSERVER2000数据库备份还原的两种方法 (带进度条)

    /// <summary>/// 通过调用MSSQL的SQLDMO.DLL文件来实现备份数据库/// 1.首先在在项目中引用SQLDMO.DLL文件./// 2.在引用中的SQLDMO.D ...

  7. 计算机二级-C语言-程序设计题-190111记录-两种指针赋值的不同,普通输入输出函数和文件输入输出函数的使用

    //程序设计题:函数fun的功能是:将两位数的正整数a,b合并形成一个整数放在c中.合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上,b数的十位和个位数依次放在c数的十位和千位上.例如:当 ...

  8. 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)

    [Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...

  9. android 一题多改系列——android 打电话实现两种方法

    在android开发中,用户能够拨打电话是最基本的需求.俗话说“条条大路通罗马”,实现拨打电话的方式有多种,今天,就提供最常用两种. 首先,拨打电话,对于用户来说,是一个耗费的操作,因此,需要一定权限 ...

随机推荐

  1. UVA 110020 Efficient Solutions (STL)

    把一个人看出一个二维的点,优势的点就是就原点为左下角,这个点为右上角的矩形,包含除了右上角以外边界,其他任意地方不存在点. 那么所有有优势的点将会形成一条下凹的曲线. 因为可能有重点,用multise ...

  2. [论文理解]Region-Based Convolutional Networks for Accurate Object Detection and Segmentation

    Region-Based Convolutional Networks for Accurate Object Detection and Segmentation 概括 这是一篇2016年的目标检测 ...

  3. java基础—java制作证书的工具keytool

    一.keytool的概念 keytool 是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.在 ...

  4. java基础—this关键字

    一.this关键字

  5. Linux性能检测常用的10个基本命令

    检测性能的10个命令汇总 uptim dmesg | tail vmstat 1 mpstat -P ALL 1 pidstat 1 iostat -xz 1 free -m sar -n DEV 1 ...

  6. 编译-LAMP基于fastcgi

    前言 最近没更新新篇幅了,今天就来点干活,过多的也不说了下面着手干!干!干! 准备环境 centos7.5 apr-1.6.3.tar.gz  apr-util-1.6.1.tar.gz      h ...

  7. sql执行过长,如何入手优化

    一条sql执行过长的时间,你如何优化,从哪些方面 1.查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)2.涉及链表的查询,是否能进 ...

  8. python文件打包为exe可执行文件的方法

    我自己常用Pyinstaller库打包 第一步: 安装pyinstaller库   pip install pyinstaller 第二步: 在py文件所在目录输入 mydemo.py是自己写的py文 ...

  9. matplotlib学习记录 三

    # 绘制自己和朋友在各个年龄的女友数量的折线图 from matplotlib import pyplot as plt # 让matplotlib能够显示中文 plt.rcParams['font. ...

  10. solr7.7.1完整教程

    安装 上传solr-7.7.1.tgz至服务器 opt文件加下 解压 tar -zxvf solr-7.7.1.tgz 运行 进入到加压后的文件夹/opt/solr-7.7.1,执行一下命令启动sol ...