【总结】字符串匹配: KMP 和 拓展KMP

比起ac自动机,kmp就一个next数组,理解了如何初始化next后就可以搞一些模板题了,下面是还不错的学习资料,清晰易懂,自己用的模板也来自它:

 http://chaoswork.com/blog/2011/06/14/kmp%E7%AE%97%E6%B3%95%E5%B0%8F%E7%BB%93/

kmp模板
next[0]=-1;j=-1;
for(i=0;i<m;)
{while(j>=0 && p[i]!=p[j])j=next[j];i++;j++;next[i]=j;
}for(i=0,flag=0,j=0;i<n;)
{while(j>=0 && p[j]!=t[i])j=next[j];i++;j++;//已经匹配了模式串的多少个if(j==m)//匹配成功
}

接下来需要更加深入地了解next数组,许多题目需要用到它的定义来预处理字符串:

 xdu 1154

显然,用2次kmp处理处前缀和后缀在各点的匹配情况,用dp记录符合要求的子串,有几个要注意的地方:(调了2个小时T_T)

1.前缀的其实位置不但要在后缀的前面,终止位置不能超过后缀的终止位置,也就是说前缀不能包含后缀.

2. 

View Code
for(i=0,flag=0,j=0;i<n;)
{while(j>=0 && p[j]!=t[i])j=next[j];i++;j++;
  if(j==m)//若在此处记录则会出现bug,因为此时匹配完成点是i-1
}

CF也有一道与上面类似的题,需要用kmp预处理最左端前缀和最右端后缀

http://codeforces.com/contest/149/problem/E

循环节问题

它还能用来求周期字符串的循环节HDU1358:

性质:

当且仅当len%(len-next[len])==0时,str[next[len]~len-1]为最小循环节

要证明它需要说明3点:

1.一个字符串str是周期串,假设s1为它的循环节,则str=s1 s1...s1(n个) 

推导出=>len%(len-next[len])==0成立.

2.next[len]~len-1为s1 ,len%(len-next[len])==0时 

推导出=>str为周期串,s1为最小循环节

3.如何保证是最小的.

证明:

1.由next的性质知道,s[1~next[len]-1]与s[1~len-1]有最长的相等的前缀和后缀s,很显然s就是n-1个s1了.

2.设s1的长度为L,由于len%L==0 , str可以分解成若干个长度为L的小串,设它们从左到右依次为

a, a... an

根据匹配关系得

a1=a2;

a2=a3;

..

an-1=an;

因此a1=a2=a3...=an;

3.next[len]保证了前缀与后缀最大化,如果循环节s1存在而s1内还有循环节s1',则next[len]可以向后移动,与定义矛盾.

 

相等的循环同构问题

hdu3374 string problem

分析:

  最大和最小的循环同构字符串可以分开处理,求位置可以利用最小最大表示法(03wc论文 周源)

  求出现的次数可以用kmp扫一遍,但利用 循环节 可以更快地得到答案.

性质:

  字符串str由k个最小循环节s1组成,则它的相等循环同构数为k.

证明:

  设相等循环同构数为p,我们可以利用循环节s1构造出k个相等的循环同构,于是p>=k;

  下面证明p<=k:

    如果p>k

    假设在移动完s1到尾部前,出现了相同的循环同构串,不妨设此时移动的串为s2,

    则利用 循环节性质2第1种情况的推理方法 可以知道s2为字符串的一个循环节

    且s2的长度<s1,与s1为最小循环节的条件矛盾,因此p<=k.

  于是p只能等于k.

 

拓展KMP

  有很长一段时间单纯地以为拓展kmp只是kmp倒过来跑,后来发现很多问题其实无法转换成kmp解决,于是怒学了一下拓展kmp.

  首先比较一下kmp和拓展kmp解决的问题:

  kmp解决了求所有主串的前缀pre[i] (0<=i<n)的后缀与模式串前缀的最大匹配长度问题;

  拓展kmp解决了所有主串的后缀suf[i]前缀,与模式串前缀的最大匹配长度问题.

  

复制代码
 1 void getNext() {
 2     int l = 1, r = -1, i, j;
 3 
 4     for (next[0] = 0, i = 1; p[i]; ++i) {
 5         if (i + next[i - l] - 1 < r) next[i] = next[i - l];
 6         else {
 7             for (j = max(r - i + 1, 0); p[i + j] && p[i + j] == p[j]; ++j);
 8             next[i] = j; l = i; r = i + j - 1;
 9         }
10     }
11     next[0] = i;
12 }
复制代码

 

  设模式串为str;

  定义next[i]为 str 与 它的后缀suf[i]的最大公共前缀长度.

  r是当前已经确定匹配区间的最右端点,l是对应的左端点,即 r=l+next[l]-1;

  当要求next[i]时

  根据 next定义 str[ l , l+next[l]-1 ] == str[ 0 , next[l]-1 ];

  得到 str[ i , l+next[l]-1 ] == str[ i-l , next[l]-1 ];

  设s1=str[ i , l+next[l]-1 ]; 

  讨论以下情况:

  1. 若  i在 [l,r] 区间内  

   next[i-l]的值我们已经知道,这时候需要讨论:

    如果  next[i-l] 小于 s1 的长度,那么可以知道在下标为 next[i-l] 的位置必定会失配,于是next[i]=next[i-l];

    如果  next[i-l] 大于或等于 s1 的长度,那么直到r位置,我们都可以确定已经匹配上了,接下来需要确定r后面

    位置的匹配情况,而此时i已经匹配了r-i+1的长度,next[i]从这个值开始计数就可以了,计数完成后i+next[i]-1

    已经大于r,因此要更新   r=i+next[i]-1 , l=i ;

  2.若 i不在[l,r]的区间内,即 i > r, 前面得到的信息无法用到,于是我们需要从头将str[i]与str[0]进行匹配,当然也要记得更新l,r.

    复杂度:

    2个循环变量i,j都是单调增的,而他们最多增加n次,因此 复杂度是线性的.

  拓展kmp求循环节的方法参考kmp求循环节部分.

  知道这些后可以来解决这个问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最小生成树(普利姆算法、克鲁斯卡尔算法)

给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树. 求最小生成树的算法 (1) 克鲁斯卡尔算法 图的存贮结构采用边集数组,且权值相等的边在数组中排列次序可以是任意的.该方法对于边相对比较多的不是很实用,浪费时间. (2) 普里姆算法 图…

《数字化与碳中和(园区篇)》报告正式发布,助力加快推进国家“双碳”战略实施

2021年10月&#xff0c;国务院印发《2030年前碳达峰行动方案》&#xff0c;明确提出要建设绿色低碳园区&#xff0c;并选择100个具有典型代表性的城市和园区开展碳达峰试点建设&#xff0c;在政策、资金、技术等方面对试点城市和园区给予支持。此后&#xff0c;碳达峰、碳中和正…

基于开放共享的自主研发—MaxCompute 持续增强生态与开放性建设

MaxCompute产品与生态架构 MaxCompute是一个具有先进架构的Serverless云数据仓库&#xff0c;自从商业化后&#xff0c;使用的用户涉及各个行业的头部客户。在生态上需要支持主流的开源产品以及阿里云云产品。其主要包括以下几个方面&#xff1a; 数据接入生态。目前官方提供…

构建数据中台的组织架构

一、中台是一种企业架构 1.TOGAF企业架构标准 TOGAF是一套企业架构标准。企业架构是指整个公司或企业的软件和其他技术的整体观点和方法。企业架构又细分为业务架构、应用架构、数据架构、技术架构几个方向。 其中业务架构的定义是“定义业务战略和组织&#xff0c;关键业务…

源于加速,不止加速——10年沉淀,破局改变

20余年技术&#xff0c;面临破局。CDN(Content Delivery Network&#xff0c;内容分发网络) 是一个超大规模的分布式系统&#xff0c;为互联网各类App和Web站点提供动 / 静态内容、实时流媒体加速以及网络安全防护等能力。在线购物、直播、音乐、游戏、社交等等一切&#xff0c…

5分钟让你在大火的多模态领域权威榜单VQA上超越人类

ModelScope上开源了达摩院众多业界最强多模态模型&#xff0c;其中就有首超人类的多模态预训练视觉问答模型mPLUG&#xff0c;小编激动的搓搓小手&#xff0c;迫不及待的体验了一下。 一探&#xff1a;浅草才能没马蹄 市面上有好多号称“用户上手简单”&#xff0c;“一步到位…

私有化输出的服务网格我们是这样做的

介绍 微服务开发的问题 微服务架构下我们在开发中遇到的常见的问题有以下 4 个&#xff1a; 多语言问题&#xff1a;有多种编程语言&#xff0c;node.js, JAVA, GoLang…微服务需要为每种语言都维护一种中间件 SDK升级推动难&#xff1a;SDK 升级需要推动业务应用进行代码修…

技术解读:Dragonfly 基于 P2P 的智能镜像加速系统

背景 网络下载 提起网络下载领域&#xff0c;你应该首先会想到基于 TCP/IP 协议簇的 C/S 模式。这种模式希望每一个客户机都与服务器建立 TCP 连接&#xff0c;服务器轮询监听 TCP 连接并依次响应&#xff0c;如下图&#xff1a; 上世纪末期&#xff0c;基于 C/S 模式的思想&…

Kruise Rollout:灵活可插拔的渐进式发布框架

前言 Kruise Rollout 是 OpenKruise 社区开源的渐进式交付框架。Kruise Rollout 支持配合流量和实例灰度的金丝雀发布、蓝绿发布、A/B Testing 发布&#xff0c;以及发布过程能够基于 Prometheus Metrics 指标自动化分批与暂停&#xff0c;并提供旁路的无感对接、兼容已有的多…

最小生成树的Prime算法的思想

Prime算法的核心步骤是&#xff1a;在带权连通图中V是包含所有顶点的集合&#xff0c; U已经在最小生成树中的节点&#xff0c;从图中任意某一顶点v开始&#xff0c;此时集合U{v}&#xff0c;重复执行下述操作&#xff1a;在所有u∈U,w∈V-U的边(u,w)∈E中找到一条权值最小的边…

一线技术人应该关注的四种思维能力

引言 作为长期奋战在一线的技术人&#xff0c;我深刻体会到如下几个思维能力对技术人成长的重要性&#xff0c;熟练运用这几种思维可以帮助我们快速的进入到新的领域&#xff0c;在分析、定位和解决问题上有很大帮助。 抽象思维&#xff1a;帮助我们快速抽取面对问题的关键要素…

Nacos 企业版如何提升读写性能和可观测性

概述 微服务引擎 MSE 发布 2.0.4.0 版本&#xff0c;新版本主要在性能和可观测能力升大幅提升&#xff0c;也加固了安全性。性能方面&#xff0c;基于 Dragonwell 进行构建&#xff0c;服务发现和配置性能提升达 40%以上&#xff1b;可观测方面&#xff0c;提供了服务注册的轨…

「技术人生」第9篇:如何设定业务目标

写在前面 上一篇文章讲了如何构建业务大图&#xff0c;看到有评论说这和设定 OKR 差不多啊。希望其他读者不要被类似的看法带偏。业务大图是业务顶层设计&#xff0c;是战略目标、业务长期价值、业务维度拆分、业务组织设计、业务长期发展方向、关键业务战役、短期重点事项的综…

我们总结了 3 大使用建议,并首次公开 Nacos3.0 规划图

Nacos 是什么 Nacos 是 Dynamic Naming and Configuration-Service 的首字母简称&#xff0c;定位于一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。从 2018 年 7 月开始宣布开源以来&#xff0c;已经走过了第四个年头&#xff0c;在这四年里&#xff0c;备…

容斥原理 和 欧拉函数

在概率论中&#xff0c;对于概率空间中的事件A1&#xff0c;……&#xff0c;An&#xff0c;当n 2时容斥原理的公式为&#xff1a; 当n 3时&#xff0c;公式为&#xff1a; 一般地&#xff1a; 正数n的唯一素因子分解式p1^a1 * p2^a2 * p3^a3 ……* pk^ak 。求1&#xff0c;2…

Dubbo 3 StateRouter:下一代微服务高效流量路由

目前的微服务架构中&#xff0c;通常包含服务消费者、服务提供者、注册中心、服务治理四元素&#xff0c;其中服务消费者会向注册中心获取服务提供者的地址列表&#xff0c;并根据路由策略选出需要调用的目标服务提供者地址列表&#xff0c;最后根据负载算法直接调用提供者。当…

首次全面解析云原生成熟度模型:解决企业「诊断难、规划难、选型难」问题

从“上云”到“云上”原生&#xff0c;云原生提供了最优用云路径&#xff0c;云原生的技术价值已被广泛认可。当前行业用户全面转型云原生已是大势所趋&#xff0c;用户侧云原生平台建设和应用云原生化改造进程正在加速。 然而&#xff0c;云原生复杂的技术栈和传统IT的历史包…

有效预警6要素:亿级调用量的阿里云弹性计算SRE实践

编者按&#xff1a;随着分布式系统和业务需求的飞速发展&#xff0c;监控告警在我们保障系统稳定性和事故快速恢复的全周期中都是至关重要的。9月3号&#xff0c;阿里云弹性计算管控SRE李成武老师(花名佐井)&#xff0c;受「TakinTalks稳定性社区」邀请&#xff0c;在线分享日常…

EMR 重磅发布智能运维诊断系统(EMR Doctor)——开源大数据平台运维利器

大数据运维的挑战—如何保证集群稳定与运行效率 企业级大数据集群通常拥有海量的数据存储、日常运算成干上万的计算任务&#xff0c;需要满足各类上层业务的计算需求。对于这类集群的运维往往充满着挑战&#xff1a;海量的数据、庞杂的组件以及组件之间复杂的依赖关系、对于时…

从中间件到分布式数据库,PolarDB-X 的透明之路

PolarDB-X前身是淘宝内部使用的分库分表中间件TDDL&#xff08;2007年&#xff0c;Java库的形态&#xff09;&#xff0c;早期以DRDS&#xff08;2012年开始研发&#xff0c;2014年上线&#xff0c;分库分表中间件MySQL Proxy的形态&#xff09;的品牌在阿里云上提供服务&#…