【学习笔记】exkmp(Z函数)

本文参考洛谷题解:https://www.luogu.com.cn/article/cq4b4e5f
侵删

前言

exkmp 和 kmp 要求的东西比较类似。
exkmp 可以求出 a i . . . n a_{i...n} ai...n b b b 的最长公共前缀。
这玩意也称 z 函数。

算法流程

求解 nxt 数组

定义 n x t i nxt_i nxti ∣ l c p ( b i . . n , b ) ∣ |lcp(b_{i..n},b)| lcp(bi..n,b),也就是 s s s 每一段后缀和自身的最长公共前缀。
例如:
在这里插入图片描述
那这玩意怎么求呢?
假设 n x t 0... x − 1 nxt_{0...x-1} nxt0...x1 已经求出,考虑如何求 n x t x nxt_x nxtx
还记得 M a n a c h e r Manacher Manacher 是怎么做的吗?你要找到最靠右的回文串,然后用它的信息求当前回文半径。
类似的,对于所有的 1 ≤ x < n 1\leq x < n 1x<n 我们要求出 i + n x t i − 1 i+nxt_i-1 i+nxti1 的最大值,记最大值编号为 k k k,记 p = k + n x t k − 1 p=k+nxt_k-1 p=k+nxtk1
为什么不是 0 ≤ x < n 0 \leq x <n 0x<n?因为 n x t 0 nxt_0 nxt0 一定等于 n n n,这样子就没什么意义了。
根据定义,我们可以得到 b 0... n x t k − 1 = = b k . . . p b_{0...nxt_k-1}==b_{k...p} b0...nxtk1==bk...p 。如图,蓝色部分相等:
在这里插入图片描述
于是,我们就可以推出: b x − k . . . n x t k − 1 = b x . . . p b_{x-k...nxt_k-1}=b_{x...p} bxk...nxtk1=bx...p
在这里插入图片描述
我们最终的目的是求出 n x t x nxt_x nxtx x x x 对应的位置是 x − k x-k xk,所以我们要根据 x − k x-k xk 判断 x x x能跳多远。
l = n x t x − k l=nxt_{x-k} l=nxtxk,如果 x − k + l − 1 x-k+l-1 xk+l1 还在绿色区域范围内,也就是 x − k + l − 1 ≤ n x t k − 1 x-k+l-1\leq nxt_k-1 xk+l1nxtk1,那么 b x − k . . . x − k + l − 1 = = b x . . . x + l − 1 b_{x-k...x-k+l-1}==b_{x...x+l-1} bxk...xk+l1==bx...x+l1。如图,灰色部分相等:
在这里插入图片描述
但是如果它超出了绿色部分,超出的部分就不能保证相等了,要暴力匹配。如图:
在这里插入图片描述
这个过程是不是和Manacher一毛一样?

vector<int> getNext(string &s)
{vector<int> nxt(s.size());int p=0; //furthest position p=k+nxt[k]-1int k=1; //furthest position idnxt[0]=s.size();while(p+1<s.size()&&s[p]==s[p+1])p++;nxt[1]=p;for(int i=2; i<s.size(); i++){p=k+nxt[k]-1;int l=nxt[i-k]; //if i+l<=p then [i,i+l-1] == [i-k,i-k+l-1]if(i+l<=p) nxt[i]=l;else{int j=max(0ll,p-i+1);while(i+j<s.size()&&s[i+j]==s[j])j++;nxt[i]=j;k=i;}}return nxt;
}

求解 extend 数组(z函数)

和求解 n x t nxt nxt 数组的过程类似。
在这里插入图片描述

vector<int> getExtend(string &s,string &t,vector<int> &nxt)
{int p=0,k=0;while(p<s.size()&&p<t.size()&&s[p]==t[p]) p++;vector<int> ext(s.size());ext[0]=p;for(int i=1; i<s.size(); i++){p=k+ext[k]-1;int l=nxt[i-k];if(i+l<=p) ext[i]=l;else{int j=max(0ll,p-i+1);while(i+j<s.size()&&j<t.size()&&s[i+j]==t[j])j++;ext[i]=j;k=i;}}return ext;
}

【模板】扩展 KMP/exKMP(Z 函数)

在这里插入图片描述
在这里插入图片描述

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+7,inf=1e18;
vector<int> getNext(string &s)
{vector<int> nxt(s.size());int p=0; //furthest position p=k+nxt[k]-1int k=1; //furthest position idnxt[0]=s.size();while(p+1<s.size()&&s[p]==s[p+1])p++;nxt[1]=p;for(int i=2; i<s.size(); i++){p=k+nxt[k]-1;int l=nxt[i-k]; //if i+l<=p then [i,i+l-1] == [i-k,i-k+l-1]if(i+l<=p) nxt[i]=l;else{int j=max(0ll,p-i+1);while(i+j<s.size()&&s[i+j]==s[j])j++;nxt[i]=j;k=i;}}return nxt;
}
vector<int> getExtend(string &s,string &t,vector<int> &nxt)
{int p=0,k=0;while(p<s.size()&&p<t.size()&&s[p]==t[p]) p++;vector<int> ext(s.size());ext[0]=p;for(int i=1; i<s.size(); i++){p=k+ext[k]-1;int l=nxt[i-k];if(i+l<=p) ext[i]=l;else{int j=max(0ll,p-i+1);while(i+j<s.size()&&j<t.size()&&s[i+j]==t[j])j++;ext[i]=j;k=i;}}return ext;
}
void O_o()
{string s,t;cin>>s>>t;auto nxt=getNext(t);auto ext=getExtend(s,t,nxt);int a=0,b=0;for(int i=0; i<nxt.size(); i++){a^=(i+1)*(nxt[i]+1);}for(int i=0; i<ext.size(); i++){b^=(i+1)*(ext[i]+1);}cout<<a<<"\n"<<b<<"\n";
}
signed main()
{ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);cout<<fixed<<setprecision(12);int T=1;
//	cin>>Twhile(T--){O_o();}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【大模型对话 的界面搭建-Open WebUI】

Open WebUI 前身就是 Ollama WebUI&#xff0c;为 Ollama 提供一个可视化界面&#xff0c;可以完全离线运行&#xff0c;支持 Ollama 和兼容 OpenAI 的 API。 github网址 https://github.com/open-webui/open-webui安装 第一种 docker安装 如果ollama 安装在同一台服务器上&…

博士德王道4S管理系统存在SQL注入漏洞

漏洞描述 博士王道汽车4S企业管理系统&#xff08;以下简称“王道4S系统”&#xff09;是一套专门为汽车销售和维修服务企业开发的管理软件。该系统是博士德软件公司集10余年汽车行业管理软件研发经验之大成&#xff0c;精心打造的最新一代汽车4S企业管理解决方案。石家庄博士…

三子棋小游戏

使用C语言编写代码&#xff0c;实现一个简单小游戏---三子棋 这里创建1个game.h文件&#xff0c;用来声明函数、宏的文件&#xff0c;一个game.c文件用来实现函数game&#xff08;&#xff09;&#xff0c;一个play.h文件用来作为该游戏的源文件。 具体代码如下&#xff1a; …

文件上传、amrkdown编辑器

一、文件上传 这里我以图片为例&#xff0c;进行上传&#xff0c;上传到阿里云oss&#xff08;对象存在中&#xff09; 首先&#xff0c;我们先梳理一下&#xff0c;图片上传的流程 1、前端选择文件&#xff0c;提交文件 前端提交文件&#xff0c;我们可以使用ElementUI中的…

网络:TCP协议-报头字段

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 文章目录 前言一、TCP协议格式16位源端口号 和 16位目的端口号4位首部长度16位窗口大小32位序号 和 32位确认序号6种标记位 和 16位紧急指针 总结 前言 本文是我对于TCP协…

大数据新视界 --大数据大厂之大数据存储技术大比拼:选择最适合你的方案

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【hot100-java】【下一个排列】

R8-技巧篇 最近速成java中&#xff0c;算法基础需要兼顾。 class Solution {public void nextPermutation(int[] nums) {int lennums.length;List<Integer>list new ArrayList<>();boolean flagtrue;for (int ilen-1;i>0;i--){list.add(nums[i]);Collections.…

[spring]用MyBatis XML操作数据库 其他查询操作 数据库连接池 mysql企业开发规范

文章目录 一. MyBatis XML配置文件1. 配置链接字符串和MyBatis2. 写持久层代码方法定义Interface方法实现xml测试 3. 增删改查增:删改查 二. 开发规范(mysql)三. 其他查询操作1. 多表查询2. #{} 和 ${}(面试题)使用区别 排序功能like查询 三. 数据库连接池 一. MyBatis XML配置…

矩阵的逆怎么算?逆矩阵公式来了(附逆矩阵计算器)

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f4da; 在线性代数中&#xff0c;逆矩阵是一个非常重要的概念。一个方阵如果存在逆矩阵&#xff0c;意味着该矩阵是可逆的&#xff0c;或者说是非奇异的。逆矩阵在解决线性方程组、计算矩阵的方根等方面有着广泛的应…

啤酒过滤——关于过滤助剂的介绍

在啤酒的酿造过程中&#xff0c;过滤是一个关键步骤&#xff0c;在啤酒厂中最常用的过滤助剂主要有两种&#xff1a;硅藻土和珍珠岩。它们能够帮助去除杂质&#xff0c;确保啤酒的清澈和口感。过滤助剂通常以粉状形式存在&#xff0c;它们被涂抹在过滤机的支撑材料上&#xff0…

应急响应--来不来得及走流程...

免责声明&#xff1a;本文仅做分享&#xff01; 应急响应详解 概述 应急响应是现代信息安全管理中的重要一环。随着网络威胁的日益复杂化&#xff0c;企业和组织必须具备快速响应安全事件的能力&#xff0c;以最大限度地减少数据泄露、业务中断以及经济损失。本文将从应急响应…

衍射的角谱理论

一、单色平面波与本征函数 不考虑夫琅禾费近似, 则相干光场在给定二平面间的传播过程就是通过一个二维线性空不变系统。 上式函数是这个系统的本征函数,表示振幅为1的平面波在xy平面上的复振幅分布,空间频率分量 = cos / , = cos / 与平面波的传播方向相联系, 空间…

单链表进阶

之前已经介绍过单链表及其一些简单的功能 这次来简单介绍单链表一些的其他接口 1.在指定位置之前插入数据 具体原码&#xff0c;三个参数&#xff0c;phead是链表的指针&#xff0c;pos是节点的地址&#xff0c;x是需要插入的数据。 pos不能为空指针&#xff0c;因为pos为空…

P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪

原理构造法 令ans c1 c2 .. cn ci 余数 * &#xff08;c1乘到cn但不乘ci&#xff09;* &#xff08;c1乘到cn但不乘ci 的逆元&#xff0c;模ci意义下&#xff09; 定理&#xff1a;在模M c1乘到cn 意义下&#xff0c;解唯一。 #include<bits/stdc.h> #define in…

如何修改音频的音量增益

一、前言 在开发音频相关的功能&#xff08;比如说语音通话、播放音乐&#xff09;时&#xff0c;经常会遇到音量太小的问题&#xff0c;这时候就需要我们对原始数据进行处理。本文将介绍如何通过修改原始音频数据来增加增益&#xff0c;本文包含如下内容&#xff1a; 1.音频数…

HTML标题标签与其属性

在HTML中标题是通过<h1..6> </h1...6>标签进行定义的。其中<h1>是定义最大的标题&#xff0c;<h6>是定义最小的标题。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"…

项目启动卡住不动Property ‘mapperLocations‘ was not specified.

问题如上图所示&#xff1b; 原因&#xff1a;在mapper打了个断点&#xff01;

Mapbox封装图形绘制工具 线,圆,polygon,删除,点 mapbox-gl-draw-circle mapbox-gl-draw

使用插件&#xff0c;安装 npm install mapbox-gl-draw-circle //绘制圆 npm install mapbox/mapbox-gl-draw //绘制点线面删除相关API地址&#xff1a;https://github.com/mohong/mapbox-gl-draw-circle https://github.com/mapbox/mapbox-gl-draw/blob/main/docs/API.md…

大数据Flink(一百二十四):案例实践——淘宝母婴数据加速查询

文章目录 案例实践——淘宝母婴数据加速查询 一、​​​​​​​创建数据库表并导入数据 二、​​​​​​​​​​​​​​创建session集群 三、​​​​​​​​​​​​​​源表查询 四、​​​​​​​​​​​​​​指标计算 案例实践——淘宝母婴数据加速查询 随着…

【信息论基础第三讲】再谈离散信源的信息测度之熵的性质多符号信源的信息测度

一、Piece Of Cake 1、离散信源X的熵是H(X)是一个常数而不是一个变量 解释&#xff1a;离散信源的熵也就是自信息I(X)的数学期望&#xff0c;即H(X) E[I(Xi)]&#xff0c;而通过概率论的知识我们知道数学期望是一个常数&#xff0c;故熵也是一个常数。 2、八元编码系统&…