(模板)扩展KMP算法

扩展KMP(exkmp) exkmpexkmpexkmp 求解的问题:对于给定的主串 SSS ,和模式串 TTT ,求出主串 SSS 的所有后缀与模式串 TTT 的最长公共前缀长度。 KMPKMPKMP 求解的问题是在主串 SSS 中模式串T出现的次数和位置,扩展KMP扩展KMP扩展KMP 求解问题包含了 KMPKMPKMP 求解的问题,因为主串 SSS 中与模式串 TTT 的最长公共前缀长度等于 ∣T∣|T|∣T∣ 的后... 阅读详情

问题定义:给定两个字符串S和T(长度分别为n和m),下标从0开始,定义extend[i]等于S[i]…S[n-1]与T的最长公共前缀的长度,求出所有的extend[i]。

#include<iostream>
#include<string>
using namespace std;

/* 求解T中next[],注释参考GetExtend() */
void GetNext(string T, int next1[])
{
    int t_len = T.size();
    next1[0] = t_len;
    int a;
    int p;

    for (int i = 1, j = -1; i < t_len; i++, j--)
    {
        if (j < 0 || i + next1[i - a] >= p)
        {
            if (j < 0)
                p = i, j = 0;

            while (p < t_len&&T[p] == T[j])
                p++, j++;

            next1[i] = j;
            a = i;
        }
        else
            next1[i] = next1[i - a];
    }
}

/* 求解extend[] */
void GetExtend(string S, string T, int extend[], int next1[])
{
    GetNext(T, next1);  //得到next
    int a;
    int p;             //记录匹配成功的字符的最远位置p,及起始位置a
    int s_len = S.size();
    int t_len = T.size();

    for (int i = 0, j = -1; i < s_len; i++, j--)  //j即等于p与i的距离,其作用是判断i是否大于p(如果j<0,则i大于p)
    {
        if (j < 0 || i + next1[i - a] >= p)  //i大于p(其实j最小只可以到-1,j<0的写法方便读者理解程序),
        {                                   //或者可以继续比较(之所以使用大于等于而不用等于也是为了方便读者理解程序)
            if (j < 0)
                p = i, j = 0;  //如果i大于p

            while (p < s_len&&j < t_len&&S[p] == T[j])
                p++, j++;

            extend[i] = j;
            a = i;
        }
        else
            extend[i] = next1[i - a];
    }
}

int main()
{
    int next1[100] = { 0 };
    int extend[100] = { 0 };
    string S = "aaaaabbb";
    string T = "aaaaac";

    GetExtend(S, T, extend, next1);

    //打印next和extend
    cout << "next:    " << endl;
    for (int i = 0; i < T.size(); i++)
        cout << next1[i] << " ";

    cout << "\nextend:  " << endl;
    for (int i = 0; i < S.size(); i++)
        cout << extend[i] << " ";

    cout << endl;
    return 0;
}
[C++]洛谷:【模板】扩展 KMP(Z 函数) 算法详解 KMP扩展(Z函数)算法详解,简单易懂! 阅读详情

相关推荐

KMP算法模板

KMP模板 ========================================================================

【扩展KMP】【模板】讲解

【扩展KMP】【模板】讲解 摘自 拓展kmp算法总结 1、扩展KMP是什么?解决何种问题?与KMP算法的异同? 拓展kmp是对KMP算法的扩展,它解决如下问题: 定义母串S,和字串T,设S的长度为n,T的长度为m,求T与S的每一个后缀的最长公共前缀,也就是说,设extend数组,extend[i]表示T与S[i,n-1]的最长公共前缀,要求出所有extend[i](0&amp;amp;amp;lt;=...

Floraqiu的博客 2409

扩展KMP算法(Extend KMP)

扩展kmp既是求模式串和主串的每一个后缀的最长公共前缀 即令s[i]表示主串中以第i个位置为起始的后缀,则B[i]表示s[i]和模式串的最长公共前缀 显然KMP是求s[i]=模式串长度的情况,所以,扩展KMP是对KMP的拓展 像求KMP的next数组一样,我们先求A[i],表示模式串的后缀和模式串的最长公共前缀 然后再利用A[i]求出B[i] 说明一下A的求法,B同理 现在我们要求A[i],且A[1]—A[i-1]已经求出,设k,且1<=k<=i-1,并满足k+A[k]最大 所以T[k]–T[k+A[k]-1]=T[0]–T[A[k]-1],推出T[i]–T[k+A[k]-1]=T[i-k]–

扩展KMP算法

如果要用哈希统计从 s 中每一位字符开始最多可以匹配多少位 p 中的字符,需要用到二分查找,此时时间复杂度为Onlogmm,其中 n 表示 s 的长度,m 表示 p 的长度。扩展KMP(也称为Z algorithm)能够以的时间复杂度求出一个字符串 s 和它的任意的的长度。注意其与KMP算法求出的 next 数组的区别,一个是以字符s[i]结束,另一个是从字符s[i]开始。

P0rscher的博客 883

用Coze平台30分钟打造《花光10亿》小游戏:零代码AI开发实战

本文详细介绍了如何利用字节跳动推出的Coze平台,在30分钟内零代码开发一款名为《花光10亿》的AI小游戏。通过配置提示词、集成图像生成插件、构建自动化工作流以及使用数据库功能,即使没有编程基础的用户也能快速将创意转化为可交互的智能应用,体验AI开发的便捷与高效。

weixin_29313547的博客 206

Origin 2025b中文版安装全指南:避开乱码、水印与崩溃陷阱

Origin作为科研绘图领域的事实标准,其2025b版本首次官方支持简体中文UI,但安装远非‘下一步’即可完成。核心在于理解软件本体、语言包、许可证服务与系统区域设置四者间的耦合关系——尤其Windows非Unicode程序语言必须设为‘中文(简体,中国)’,否则必然触发坐标轴乱码、PDF文字方块等典型故障;而AI辅助拟合、内置Python 3.11等新特性,又依赖正确的字体链(如SimSun)与注册表强制加载(UILanguage=zh-CN)才能稳定启用。该版本广泛应用于材料科学、电化学、XRD/SEM

weixin_42548874的博客 1399

扩展KMP的详细理解

扩展KMP的详细理解扩展KMP求的是对于原串S1的每一个后缀子串与模式串S2的最长公共前缀。它有一个next[]数组和一个extend[]数组。next[i]表示为模式串S2中以i为起点的后缀字符串和模式串S2的最长公共前缀长度.其中,next[0]=l2; next[i]=max{ k|i&lt;=i+k-1&lt;l2 &amp;&amp;S2.substring(i,i+k-1) == S2...

brandong 1万+

迭代牛顿-欧拉法——机器人动力学逆解

迭代牛顿-欧拉法牛顿欧拉法的步骤向外回归(outward recursion)step 1step 2向内回归(inward recursion)step 3step 4牛顿欧拉法的三种形式无坐标系NE算法(Coordinate-Free Algorithm)连杆坐标系NE算法(Link-Coordinates Algorithm)3-D向量NE算法 牛顿欧拉法的步骤 牛顿欧拉法(NE)是求解机器人动力学逆解的一种方法。动力学逆解定义为:已知机器人的构型qqq和运动的速度q˙\dot{q}q˙​和加速度q¨

qq_41845878的博客 4096

扩展KMP(Z函数)详解

对于一个长度为n的字符串S。z[i] 表示S与其后缀S[i,n]的**最长公共前缀(LCP)**的长度。国外一般将计算该数组的算法称为,而国内则称其为扩展 KMP。下面介绍O(N)时间复杂度内求解Zfunc的方法。Manacher(马拉车)算法详解,原理分析-优快云博客。

EQUINOX1的博客 997

【BIM入门实战】Revit创建地形的几种方法及优缺点

Revit在体量和场地选项卡的【地形表面】工具可以创建三维地形,有三种方法:放置点、指定点文件和导入实例文件、倾斜摄影点云技术和InfraWorks地形生成。 文章目录1. 放置点2. 指定点文件3. 导入实例文件4. 倾斜摄影点云技术5. InfraWorks地形生成 1. 放置点 放置点功能位于体量和场地选项卡下地形表面,点开找到放置点,并通过自定义设置点的高程值来创建地形的高程数据。 优点:通过用户自定义高程点来绘制模型,使地形更为精确。 缺点:只适用于面积小的项目,面积太大,人工效率低下。 .

智慧空间实验室 4758

QT实现OPCUA服务端客户端(附完整源码)

QT实现OPCUA服务端客户端(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1818

扩展KMP算法模板

Description \(txt\)为文本串,\(pat\)为模式串。 \(nxt[i]\): \(pat[i:]\)与\(pat[]\)的最长公共前缀的长度。 \(ext[i]\): \(txt[i:]\)与\(pat[]\)的最长公共前缀的长度。 \(pre\_kmp(pat)\):模式串与模式串自己匹配,得到\(nxt[]\)数组。 \(ext\_kmp(txt,pat)\):求\(nxt...

weixin_30640291的博客 94

CAPL诊断功能实现

UDS(Unified Diagnostic Services)是一种用于汽车电子系统诊断的标准协议。它定义了一系列诊断服务,用于读取和写入车辆电子控制单元(ECU)中的数据,以及处理诊断故障码(DTC)。UDS协议通常运行在CAN总线上,使用ISO 15765-2(ISO-TP)协议进行数据传输。通过本文的学习,读者应该对CAPL诊断功能实现有了初步的了解,并能够编写复杂的CAPL脚本。在实际项目中,CAPL的应用非常广泛,希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1516

(转)扩展KMP算法模板

原理博客插眼:https://www.cnblogs.com/dilthey/p/8620119.html 用途:给出两个字符串s和t,extend[i]代表在字符串s中,以i为起点开始的后缀,与字符串t所匹配的最大前缀长度 代码: const int N=1e5+100; //字符串长度最大值 int Next[N],extend[N]; char s[N],t[N]; //预...

Falcon的博客 440

Python爬虫实战:模拟登录知乎 – 通过加密参数和验证码实现自动登录

通过本篇博客的讲解,我们学习了如何通过 POST请求 和 验证码识别,模拟登录知乎并爬取用户信息、问题数据。随着爬虫技术的发展,面对更复杂的反爬虫机制,我们可以不断调整策略,以绕过这些防护,实现数据的自动化抓取。

2201_76125261的博客 731

YOLO26涨点改进 | 细节涨点篇 | 源自SCI一区 | YOLO26引入HWD小波下采样模块,而不会显著增加计算开销,(适合小目标分割任务、小目标检测任务)

本文提出了一种基于Haar小波变换的下采样模块HWD,用于改进YOLO26目标检测性能。HWD模块通过小波变换降低特征图分辨率,同时将空间信息编码到通道维度,有效保留了关键信息。相比传统下采样方法,HWD能显著减少信息不确定性,提升小目标检测精度。实验表明,该模块可无缝集成到CNN架构中,不增加计算开销。文章详细介绍了HWD的实现原理、代码结构以及在YOLO26中的集成方法,并提供了两种改进版yaml配置文件。该创新模块已在多种数据集上验证有效,特别适合语义分割和目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 401

KMP与扩展KMP

文章目录KMP扩展KMP KMP 原理看这:原理orz 模板: #include<cstdio> #include<cstring> using namespace std; const int N = 1e6 + 10; int ne[N]; int lt,lp; char a[N],b[N]; void getnext(){ int j = 0,k = -1; ne[0] = -1; while(j < lp){ if(k == -

juruo_c的博客 232

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数据结构与算法:Manacher算法和扩展KMP

Manacher算法和扩展KMP

2402_89326161的博客 738

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

NOI字符串算法:扩展KMP

字符串匹配: KMP算法 (+扩展KMP) 字符串匹配: KMP算法 (+扩展KMP) - 知乎 KMP+扩展KMP KMP+扩展KMP_Slime-优快云博客_扩展kmp 扩展KMP - yefeng1627 - 博客园 【扩展KMP】【模板】讲解 【扩展KMP】【模板】讲解_Floraqiu的博客-优快云博客 从头到尾彻底理解扩展KMP 从头到尾彻底理解扩展KMP_ 小G的ACM之路-优快云博客 对扩展KMP的一些理解 对扩展KMP的一些理解_画船听雨眠-CSD

青少年趣味编程 286

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher

可算在学校大佬的带领下 正经学了点算法了 人的专注力不行啊我 挂个题目链接 24道题搞定了21,看其他的完成率,估计不行了 当然还是有些看了题解的。 写这个主要是为了总结一下板子,和思路吧,以后好直接抄,嘿嘿 KMP模板 next数组 next_[0] = -1; int i = 0, j = -1; while (i < e) {//e字符串c1长度 if (j == -1 || c1[i] == c1[j]) { i++; j++; next_[i] = j

qq_45810570的博客 420

扩展kmp算法

扩展KMP就是说,给出模板串S和串T,长度分别为Slen和Tlen,,求出S[i..Slen-1]与T的最长公共前缀长度,记为extend[i](或者说,extend[i]为满足S[i..i+z-1]==T[0..z-1]的最大的z值)。 扩展KMP可以用来解决很多字符串问题,如求一个字符串的最长回文子串和最长重复子串。 推荐一些自己学习扩展KMP的文章: http://blog.csdn.ne

scorpio_j的博客 248

2019 新年聚-KMP & 扩展KMP & Manacher

经过昨天晚上的努力,终于弄明白了kmp,以前也不负责数据结构,只是简单了解,具体怎么实现的早忘了,,昨天重新整理,终于自己写了一个AC的模板代码,,巨不容易。。 不过扩展KMP还没怎么看,先跟着榜单,把/kmp的题刷上吧, 然后马拉车的题,都忘记自己学过了,,原先就有个模板,,直接用了,才发现看过底层实现原理,,不过现在忘记了,,还是因为以前不负责这一块,,就没怎么好好看,仅限于了解吧,,,都...

AAAAAAAC的博客 151

kmp&扩展kmp&manacher&最大最小表示法模板

kmp&扩展kmp&manacher&最大最小表示法模板

污miao汪的博客 513

扩展KMP 算法

扩展KMP算法描述: 给出模板串S和串T,长度分别为Slen和Tlen,要求在线性时间内,对于每个S[i](0 最长公共前缀长度,记为extend[i] 代码: import java.util.Scanner; public class Main { public int[] getNext(String s){ int[] next=new in

小熊听 275

KMP和扩展KMP

原文转自:http://www.cppblog.com/MatoNo1/archive/2011/04/17/144390.aspx KMP:给出两个字符串A(称为模板串)和B(称为子串),长度分别为lenA和lenB,要求在线性时间内,对于每个A[i](0 【算法】 设next[i]为满足B[i-z+1..i]==B[0..z-1]的最大的z值(也就是B的自身匹配)。设目前next[0

u010518658的专栏 529
上一篇: Codeforces Round #481 (Div. 3)
下一篇: 字符串的最小表示法(模板)
HumveeA6
博客等级 码龄17年 12粉丝 175原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值