两种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开发中,用户能够拨打电话是最基本的需求.俗话说“条条大路通罗马”,实现拨打电话的方式有多种,今天,就提供最常用两种. 首先,拨打电话,对于用户来说,是一个耗费的操作,因此,需要一定权限 ...
随机推荐
- Codeforces Round #321 (Div. 2) D Kefa and Dishes(dp)
用spfa,和dp是一样的.转移只和最后一个吃的dish和吃了哪些有关. 把松弛改成变长.因为是DAG,所以一定没环.操作最多有84934656,514ms跑过,实际远远没这么多. 脑补过一下费用流, ...
- MySQL基础教程——mysql脚本编写
SQL,结构化查询语言,既是对数据库进行操作的语言,也是数据库脚本文件的扩展名. 要求:新建一个名为 library 的数据库,包含 book.reader 两张表,根据自己的理解安排表的内容并插入数 ...
- VC++:鼠标的使用
长期改变鼠标形状: SetClassLongPtr(GetSafeHwnd(), GCLP_HCURSOR, (LONG)LoadCursor(NULL, IDC_WAIT));//这个是x64下可以 ...
- Dojo中的选择器
dom.byId(以前的dojo.byId):等同于js中的document.getElementById. http://www.cnblogs.com/tiandi/archive/2013/11 ...
- java基础—多态(动态加载)
一.面向对象最核心的机制——动态绑定,也叫多态
- 第四次作业:Windows各种基本应用的命令处理方法
删除文件夹命令? rd (remove directory) 如何给文件夹重新命名? ren (rename) 如何在文件夹中建立文件夹? md swift\a 如何用命令查看文本文件的内容? typ ...
- 201621123080《Java程序设计》第十一周学习总结
201621123080<Java程序设计>第十一周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 ...
- 【netbeans】netbeans utf-8编码
首先,在你的netbeans的安装文件夹里面找到etc这个文件夹,打开,在里面找到netbeans.conf这个文件,打开,找到这一句netbeans_default_options="-J ...
- #2 create and populate a database && realistic and practical applications
The Chapter3 & Chapter4 of this book tells you how to create a realistic app on the web through ...
- HDU 3861 The King’s Problem 强连通分量 最小路径覆盖
先找出强连通分量缩点,然后就是最小路径覆盖. 构造一个二分图,把每个点\(i\)拆成两个点\(X_i,Y_i\). 对于原图中的边\(u \to v\),在二分图添加一条边\(X_u \to Y_v\ ...