在前两天的CCPC网络赛中。。。被一发KMP题卡了住了。。。遂决定,哪里跌倒就在哪里爬起来。。。把个KMP恶补一发,连带着把AC自动机什么的也整上。

首先,介绍设定:KMP算法计划解决的基本问题是,两个不同字符串间的匹配问题。

例如:

求字符串:JSADLKFMNALDGABJSDF;QSDLKJG;KERJG'ERPIWHEFCNKDSBVJKN LKGBLKM,ACFL

中 KASJDGNKAJ出现了几次?

当然上面的两个字符串都是滚键盘滚出来的恩。。。

但是直观地使用对比的方式来强行进行比对的话需要O(M*N)的时间复杂度,在两个字符串的长度逐渐增长的大背景下是很难以接受的。例如(串1长50000串2长20000)分分钟炸。

于是这个时候我们需要KMP来歼灭即将爆管的时间复杂度。处理方式,就是将底下的子字符串变成一个“有限状态自动机”,从而避免进行重复的无用匹配。具体做法是,对于输入字符串,开同样大小的数组F[MAXN]表示失配边,对于任意一个匹配失败的元素K,F[K]将指向“K元素之前,和K元素有最长公共,前缀的位置”,值得注意的是,KMP算法并没有对该位置是否符合tar[K]!=tar[F[K]]的规约和判断,这意味着,我们不能认为“F[K]指向上一个,与F[K]拥有最长公共前缀的,且不相同的子串”。这一点是我在学习KMP中的一个最开始带入的想当然的设定,其实很好想明白,就是,无论F[K]指向了什么值,最终都会有失配的可能性,遇到这种可能性之后往上一个失配点走就是了,没必要对这种可能性做特殊处理。

对于这道题来说,情况有些特殊,首先应当把字符串本身处理成一个有限状态自动机,之后每次对于上一次出现的位数进行加和操作,最终统计最大值。首先上两个参数不同的AC代码。

#include<bits/stdc++.h>
using namespace std; const long long MAXN=;
long long f[MAXN];
char tar[MAXN];
long long point[MAXN];
long long len; void init()
{
scanf("%s",tar+);
len=strlen(tar+);
int k=;
for(int i=;i<=len;++i)
{
while(k&&tar[k+]!=tar[i])k=f[k];
if(tar[k+]==tar[i])k++;
f[i]=k;
point[k]++;
}
} int main()
{
init();
long long ans=;
for(int i=len;i;i--)
{
ans=max(ans,(long long)i*(point[i]+));
point [f[i]]+=point[i];
}
cout<<ans<<endl;
}
#include<bits/stdc++.h>
using namespace std; const long long MAXN=;
long long f[MAXN];
long long point[MAXN];
char tar[MAXN];
long long len; void init()
{
gets(tar);
len=strlen(tar);
f[]=;f[]=;
for(int i=;i<len;++i)
{
int j=f[i];
while(j&&tar[i]!=tar[j])j=f[j];
f[i+]= tar[i]==tar[j]? j+:;
}
} int main()
{
cin.sync_with_stdio(false);
init();
for(int i=;i<len;++i)
{
point[i]=;
}
for(int i=len;i;--i)
{
if(f[i]&&i)
point[f[i]-]+=point[i-];
}long long ans=;
for(int i=;i<len;++i)
{
ans=max((long long)(i+)*point[i],ans);
}
cout<<ans<<endl;
return ;
}

代码1中使用了对于F[K]的规约是:F[K]等于与K拥有包括K、F[K]本身的最长公共前缀的元素

代码2(刘汝佳蓝书)使用的F[K]代表,与K元素拥有  “    绝对不  ”   包括K、F[K]在内的拥有最长公共前缀的元素,这也意味着需要取得字符串后一个位置。

51NOD 1292 1277(KMP算法,字符串中的有限状态自动机)的更多相关文章

  1. 【原创】通俗易懂的讲解KMP算法(字符串匹配算法)及代码实现

    一.本文简介 本文的目的是简单明了的讲解KMP算法的思想及实现过程. 网上的文章的确有些杂乱,有的过浅,有的太深,希望本文对初学者是非常友好的. 其实KMP算法有一些改良版,这些是在理解KMP核心思想 ...

  2. KMP算法字符串查找子串

    题目: 经典的KMP算法 分析: 和KMP算法对应的是BF算法,其中BF算法时间复杂度,最坏情况下可以达到O(n*m),而KMP算法的时间复杂度是O(n + m),所以,KMP算法效率高很多. 但是K ...

  3. KMP 算法 & 字符串查找算法

    KMP算法 Knuth–Morris–Pratt algorithm 克努斯-莫里斯-普拉特 算法 algorithm kmp_search: input: an array of character ...

  4. 常用算法3 - 字符串查找/模式匹配算法(BF & KMP算法)

    相信我们都有在linux下查找文本内容的经历,比如当我们使用vim查找文本文件中的某个字或者某段话时,Linux很快做出反应并给出相应结果,特别方便快捷! 那么,我们有木有想过linux是如何在浩如烟 ...

  5. Java KMP算法代码

    1. KMP 算法(字符串匹配算法)较 BF(朴素的字符串匹配)算法有哪些改进 1) 在主串和子串匹配的过程中,主串不再回退,只改变子串的比较位置. 2) 为子串生成对应的next数组,每次匹配失败, ...

  6. 51Nod 1277 字符串中的最大值(KMP,裸题)

    1277 字符串中的最大值 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如: ...

  7. 51NOD 1277 字符串中的最大值(KMP)

    >>点击进入原题测试<< 思路:用KMP优化的暴力写了一遍,超时!没有充分利用KMP中next数组的性质. 首先这个题是肯定要用到KMP算法的,然后会有一个next[]数组. ...

  8. KMP算法 --- 在文本中寻找目标字符串

    KMP算法 --- 在文本中寻找目标字符串 很多时候,为了在大文本中寻找到自己需要的内容,往往需要搜索关键字.这其中就牵涉到字符串匹配的算法,通过接受文本和关键词参数来返回关键词在文本出现的位置.一般 ...

  9. 51nod 1277 字符串中的最大值

    题目链接 51nod 1277 字符串中的最大值 题解 对于单串,考虑多串的fail树,发现next数组的关系形成树形结构 建出next树,对于每一个前缀,他出现的次数就是他子树的大小 代码 #inc ...

随机推荐

  1. The program 'unzip' is currently not installed. You can install it by typing:

    linux解压遇到下面问题: The program 'unzip' is currently not installed. You can install it by typing: sudo ap ...

  2. JQuery使用正则表达式验证手机号,邮箱,身份证(含有港澳台),网址

    自己对正则验证也没系统用过,这次自己做个demo,一下子把这些全都用上了,下次有需要直接来拿了. 以下代码是在页面使用JQuery进行验证的,也有在后台进行验证的,可以试试,都一样的原理. 直接上代码 ...

  3. [Java][Liferay] 解决Liferay ext项目deploy的问题

    Liferay ext project在install war包之后需要重启服务器,重启服务器中会执行ExtHotDeployListener中的逻辑,这里有一个坑,如果是第二次以后install e ...

  4. Java 编码规范有感

    应小组要求,开发测试都需要考阿里编码规范,因此,相当于是突击了一下关于编码规范方面的知识,目前做的项目后期需要进行项目迁移,数据迁移,功能迁移... 各种迁移... 阿里巴巴编码规范(Java)考试地 ...

  5. fn先生开篇博客

    开篇博客,也不清楚要写点啥nie,以前好像在CSDN上写过一点,但是由于本人工作号一直在变,忘了CSDN上的账号密码(尴尬...不确定这个以后会不会再次丢失呀),重新在开始吧. 记得以前,一直有朋友说 ...

  6. 从零开始的全栈工程师——js篇2.7(JS数据类型具体分析)

    JS数据类型具体分析与数据的三大存储格式 1. 字符串 string2. 数字 number3. 布尔 boolean4. null 空5. undefined 未定义↑↑↑叫基本数据类型 基本数据类 ...

  7. 从零开始的全栈工程师——js篇2.1(js开篇)

    JS开篇 一.js介绍 全称 javascript 但不是java 他是一门前台语言 而java是后台语言js作者 布兰登·艾奇 前台语言:运行在客户端的后台语言:跟数据库有关的 能干什么?    页 ...

  8. mockjs模拟数据请求

    一般项目的方法 <html> <head> <script> <script src="http://requirejs.org/docs/rele ...

  9. cocos2d-x 学习资料汇总

    cocos2d-x配置问题 - 我要飞的更高 - 博客频道 - CSDN.NET Cocos2d-x win7 + vs2010 配置图文详解(亲测) - 子龙山人 - 博客园 WINDONWS7+V ...

  10. GitLab一个非标准的端口远程仓库导致clone失败

    首先看下报错信息 当gitlab服务器ssh端口不是默认的22时,使用ssh连接gitlab会出现上面的错误 解决方法: 修改/etc/gitlab/gitlab.rd gitlab_rails['g ...