最近稍微看了下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. Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] B "Or" Game (贪心)

    首先应该保证二进制最高位尽量高,而位数最高的数乘x以后位数任然是最高的,所以一定一个数是连续k次乘x. 当出现多个最高位的相同的数就枚举一下,先预处理一下前缀后缀即可. #include<bit ...

  2. Python-OpenCV——亮度和对比度

    亮度与对比度 亮度调整是将图像像素的强度整体变大/变小,对比度调整指的是图像暗处变得更暗,亮出变得更亮,从而拓宽某个区域内的显示精度. OpenCV中亮度和对比度应用这个公式来计算:g(x) = αf ...

  3. 用fmt标签对EL表达式取整

    本篇文章转载自:https://blog.csdn.net/u013400939/article/details/47948541 一般来说我们是无法实现EL表达式取整的.对于EL表达式的除法而言,他 ...

  4. cocos2dx 使用XMLHttpRequest时回调status为0的问题

    今天使用cocos连接http访问时,使用XMLHttpRequest在pc上反问时正常的返回了status=0,但是在android上去返回status是0,看了一下底层代码, 发现status只有 ...

  5. iOS 打印系统字体

    NSArray * array = [UIFont familyNames]; for( NSString *familyName in array ){ printf( "Family: ...

  6. 14-15.Yii2.0模型的创建/读取数据使用,框架防止sql注入

    目录 创建数据库 表article 配置 db.php 连接数据库 创建控制器 HomeController.php 创建models 创建数据库 表article 1.创建库表 CREATE TAB ...

  7. c++IDE

    暂时使用Code::Blocks 16.01. 因为之前没有c++编译器,所以去官网选择安装codeblocks-16.01mingw-setup.exe 然后settings>Compiler ...

  8. logging记录了其他操作的问题

    做atm作业的时候,记录转账操作的那个功能的文件里,同时也记录了增加账号和冻结账号的操作 2018-11-28 17:14:51,754 : transfer : INFO : 用户edward向用户 ...

  9. MIP启发式算法:Variable neighborhood search

    *本文主要记录和分享学习到的知识,算不上原创. *参考文章见链接. 本文主要讲述启发式算法中的变邻域搜索(Variable neighborhood search).变邻域搜索的特色在于邻域结构的可变 ...

  10. Git for Windows 工具的使用(二)

    Git分支  当一个人开发功能A而另一个人开发功能B,之后代码进行整合的时候,使代码既有功能A也有功能B.在Git中,Git给了我们分支的概念. 分支可以使用我们快速的开发协作,并且快速的合并. 分支 ...