【算法】竞赛常用知识之字符串1

前言:

本系列是学习了董晓老师所讲的知识点做的笔记

董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com)

动态规划系列(还没学完)

【算法】动态规划之线性DP问题-CSDN博客

【算法】动态规划之背包DP问题(2024.5.11)-CSDN博客

【算法】动态规划之背包DP与树形DP-CSDN博客  

最小表示法

P1368 【模板】最小表示法 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

找出字符串S的循环同构串中字典序最小的那一个

循环同构串含义:字符串S中选定一个位置i满足 S[i-n]+S[1-i-1]=T,则T是S的循环同构串。S=“bcad",其循环同构串有“bcad"、“cadb"、“adbc”、“dbca”当 i=3 时,得到字典序最小的循环同构串是“adbc”。

解题技巧:复制加倍,破环成链;使用三指针控制,分类跳转,及时淘汰劣质选项

int n;
char s[N];
int get_min(){for(int i=1;i<=n;i++) s[n+i]=s[i];int i = 1, j = 2, k = 0;while(i<=n && j<=n){for(k=0; k<n&&s[i+k]==s[j+k]; k++);s[i+k]>s[j+k] ? i=i+k+1 : j=j+k+1;if(i==j) j++;}return min(i, j);
}

字符串哈希

核心:

把字符串映射成一个p进制数字

哈希碰撞:

两字符串不一样,Hash 函数值却一样

解决哈希碰撞的方法:

巧妙设置 p和 M 的值,保证p与M互质。p 通常取质数 131 或 13331.M 通常取大整数 2的64次方,把哈希函数值h定义为ULL,超过则自动溢出等价于取模。

知识点

求一个字符串的哈希值相当于求前缀和.

求一个字符串的子串的哈希值相当于求区间和.

核心代码

#include <iostream>
using namespace std;
typedef unsigned long long ULL;
const int P = 131;
// p[i]=P^i, h[i]=s[1~i]的hash值
ULL p[N], h[N];
// 预处理 hash函数的前缀和
void init() {p[0] = 1, h[0] = 0;for (int i = 1; i <= n; i++) {p[i] = p[i - 1] * P;h[i] = h[i - 1] * P + s[i];}
}
// 计算s[l~r]的 hash值
ULL get(int l, int r) {return h[r] - h[l - 1] * p[r - l + 1];
}
// 判断两子串是否相同
bool substr(int l1, int r1, int l2, int r2) {return get(l1, r1) == get(l2, r2);
}

KMP算法

    //求取next函数ne[1] = 0;for(int i = 2, j = 0; i <= n; i ++){while(j && P[i] != P[j+1]) j = ne[j];if(P[i] == P[j+1]) j ++; ne[i] = j;}// KMP匹配for(int i = 1, j = 0; i <= m; i ++){while(j && S[i] != P[j+1]) j = ne[j];if(S[i] == P[j+1]) j ++;if(j == n) printf("%d\n", i-n+1);}

扩展KMP(Z函数)(重新敲一次还是不太懂)

P5410 【模板】扩展 KMP/exKMP(Z 函数) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 

算法流程

计算完前i-1个z函数,维护盒子[l,r],则s[l,r]=s[1,r-1+1]

1. 如果i≤r(在盒内),则有 s[i,r]= s[i-l+1],r[i-l+1]。

(1)若z[i-l+ 1|<r-i+1,则z[i]=z[i-l+ 1|。

(2)若z[i-l+ 1|≥r-i+1,则令z[i]=r-i+1,从r+1往后暴力枚举

2.如果i>r(在盒外),则从i开始暴力枚举。

3.求出z[i]后,如果i+z[i]-1>r,则更新盒子l=i,r=i+ z[i]-1

核心代码

void get_z(char*s,int n){z[1]=n;for(int i=2,l,r=0;i<=n;i++){if(i<=r)z[i]=min(z[i-l+1],r-i+1);while(s[1+z[i]]==s[i+z[i]])z[i]++;if(i+z[i]-1>r)l=i,r=i+z[i]-1;}
}
void get_p(char*s,int n,char*t,int m){for(int i=1,l,r=0;i<=m;i++){if(i<=r)p[i]=min(z[i-l+1],r-i+1);while(1+p[i]<=n&&i+p[i]<=m&&s[1+p[i]]==t[i+p[i]])p[i]++;if(i+p[i]-1>r)l=i,r=i+p[i]-1;  }
}

 Manacher算法

P3805 【模板】manacher - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

知识点 

1.作用:在 O(n) 的时间内求出一个字符串中的最长回文串

2.在字符之间和串两端插入#,改造后都变成奇回文串,方便统一处理。

3.回文半径:以i为中心的最长回文串的长度的一半叫回文半径

4.加速盒子:维护右端点最靠右的盒子,盒内加速,盒外暴力

5.原串的最长回文串=新串的最大半径-1。

核心代码

    scanf("%s", a + 1);int n = strlen(a + 1), k = 0;s[0] = '$', s[++k] = '#';for (int i = 1; i <= n; i++)s[++k] = a[i], s[++k] = '#';n = k;

 

void get_d(char* s, int n) {d[1] = 1;for (int i = 2, l, r = 1; i <= n; i++) {if (i <= r) d[i] = min(d[r - i +l], r - i + 1);while (s[i - d[i]] == s[i + d[i]])d[i]++;if (i + d[i] - 1 > r) l = i - d[i] + 1, r = i + d[i] + 1;}
}

三者对比

 

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

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

相关文章

IP地址定位技术在网络安全中的作用

在当今数字化时代&#xff0c;网络安全已经成为企业、政府和个人面临的重要挑战之一。随着互联网的普及和网络攻击的增加&#xff0c;保护个人隐私和防止网络犯罪变得尤为重要。在这一背景下&#xff0c;IP地址定位技术作为网络安全的重要组成部分之一&#xff0c;发挥着关键作…

宝塔面板Java项目部署,五步轻松搞定

当涉及到正规的开发项目时&#xff0c;最终的上线部署是至关重要的一个环节。本文旨在以最简单便捷的方法来教你如何完成项目的部署工作。 1. SSH下载地址 项目完成后需要使用SSH终端进行项目部署&#xff0c;以确保安全的远程访问、和操作远程服务器。 Xshell (支持Windows系…

树莓派遇到ping的奇葩问题解决办法

首先&#xff0c;先 ping raspberrypi 一下。获得树莓派的ip 然后开始配置静态ip winR后输入命令ipconfig查询当前网关ip 输入命令sudo nano /etc/dhcpcd.conf 在最末尾输入以下信息 -----------------------------------------------------------------------------------…

多态的学习

1. &#x1f3f7;多态的概念 多态的概念&#xff1a; 通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的状态。 举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票…

将Flutter程序打包为ios应用并进行安装使用

如果直接执行flutter build ios: Building com.example.myTimeApp for device (ios-release)...════════════════════════════════════════════════════════════════════════════════No vali…

Web自动化 - selenium

文章目录 一、selenium的使用selenium的安装 二、元素1. 定位选择元素1.id 定位2. class_name 定位find_element 和 find_elements的区别3. TAG_NAME 定位4. 超链接 定位 2. 操控元素1. 查询内容2. 获取元素文本内容3. 获取元素属性 3. 浏览器常用操作API4. 鼠标操作 - perform…

Python 全栈系列244 nginx upstream 负载均衡 踩坑日记

说明 最初是因为租用算力机(Python 全栈系列242 踩坑记录:租用算力机完成任务)&#xff0c;所以想着做一个负载均衡&#xff0c;然后多开一些服务&#xff0c;把配置写在nginx里面就好了。 一开始租用了一个3080起了一个服务&#xff0c;后来觉得速度不够快&#xff0c;再起了…

DOM 文档对象模型

一、DOM简介 1、什么是DOM DOM 文档对象模型简称&#xff0c;是W3C组织推荐的处理可扩展标记语言的标准编程接口 W3C已经定义了一系列的DOM接口&#xff0c;通过这些接口可以改变网页的内容、结构、样式 2、DOM树 DOM把以上内容都看做是对象 二、获取元素 获取页面元素&am…

day001 ~如何修改主机名

命令行方式设置主机名 # 这个很重要&#xff01;用命令改方便些 hostnamectl set-hostname ocloud-252 #查询&#xff0c;exit或logout重新登录后发现主机名换掉 hostname nmtui方式修改 nmtui 在工作中,如果机器很多,最好修改主机名做好标识不至于弄混,方便管理.

LeetCode—用队列实现栈

一.题目 二.思路 1.后入先出的实现&#xff1a; 创建两个队列来实现栈&#xff08;后入先出&#xff09;&#xff1a; 两个队列&#xff0c;保持一个存数据&#xff0c;另一个为空&#xff0c;入数据&#xff08;push&#xff09;要入不为空的队列&#xff0c;&#xff08;p…

DDS块集是如何工作的?

DDS块集使你能够在Simulink中创建DDS应用程序。如果你有一个在Simulink中建模的应用程序&#xff0c;希望能够使用DDS&#xff0c;则可以使用DDS块集轻松连接到DDS中间件平台。 DDS块集将DDS概念引入Simulink环境&#xff0c;在Simulink应用程序中对这些概念进行建模&#xff0…

STM32串口通信入门

文章目录 一、串口协议和RS-232标准&#xff0c;以及RS232电平与TTL电平的区别1.串口通信协议2.RS-232标准3.RS232电平与TTL电平的区别4.USB/TTL转232“模块&#xff08;CH340芯片为例&#xff09; 二、补充实验&#xff08;一&#xff09;几个常见的库函数、结构体1.时钟配置函…

【机器学习数据可视化-04】Pyecharts数据可视化宝典

一、引言 在大数据和信息爆炸的时代&#xff0c;数据可视化成为了信息传递和展示的关键手段。通过直观的图表和图形&#xff0c;我们能够更好地理解数据&#xff0c;挖掘其背后的信息。Pyecharts&#xff0c;作为一款基于Python的数据可视化库&#xff0c;凭借其丰富的图表类型…

多模态EDA论文小记

论文地址 该论文主要改进点是&#xff1a;通过动态化局部搜索中每个集群大小&#xff0c;高斯和柯西分布共同产生个体。总的来说改进点不多&#xff0c;当然也可能是笔者还没发现。 局部搜索 划分集群 划分集群有两个策略分别是&#xff1a; 随机生成一个点作为中心点&…

MySQL表死锁查询语句

步骤1&#xff1a;查询表死锁的sql语句&#xff1a; SELECT * FROM information_schema.PROCESSLIST where length(info) >0 ; 或 SELECT * FROM information_schema.INNODB_TRX; 步骤2&#xff1a;删除 kill "对应的线程id"

【JVM】Class文件的格式

目录 概述 Class文件的格式 概述 Class文件是JVM的输入&#xff0c;Java虚拟机规范中定义了Class文件的结构。Class文件是JVM实现平台无关、技术无关的基础。 1:Class文件是一组以8字节为单位的字节流&#xff0c;各个数据项目按顺序紧凑排列 2:对于占用空间大于8字节的数据…

16 华三数据中心最流行的技术 M-LAG

STP和MTP&#xff08;第二十二课&#xff09;-CSDN博客 VRRP技术和浮动路由(第二十六课)_vrrp 浮动路由-CSDN博客 VRRP DHCP ACL NAT 网络核心路由技术综述 (第十课)-CSDN博客 04 交换机的IRF的配置-CSDN博客 1 M-LAG AI介绍 M-LAG&#xff08;Multi-Chassis Link Aggrega…

其他的 框架安全:Apache Solr 远程代码漏洞.(CVE-2019-0193)

什么是 Apache Solr Apache Solr是一个开源的搜索服务&#xff0c;便用Java语言开发&#xff0c;主要基于 HTTP 和ApacheLucene 实现的。Sor是一个高性能&#xff0c;采用Java5开发&#xff0c;基于Lucene的全文搜索服务器。 目录&#xff1a; 什么是 Apache Solr 生成的漏…

基于yolov5+streamlit目标检测演示系统设计

YOLOv5与Streamlit&#xff1a;智能目标检测可视化展示介绍 随着人工智能技术的飞速发展&#xff0c;目标检测技术已成为推动智能化社会进步的关键技术之一。在众多目标检测算法中&#xff0c;YOLOv5以其卓越的性能和实时性&#xff0c;成为了业界的佼佼者。与此同时&#xff…

Spring Boot 集成 sa-token 实践教程

Spring Boot 集成 sa-token 实践教程 sa-token 是一个轻量级且功能强大的权限认证框架&#xff0c;它基于Java语言&#xff0c;专为Java开发者设计&#xff0c;以简化权限管理的复杂性。在Spring Boot项目中集成sa-token&#xff0c;可以快速实现会话管理、权限控制等功能。本文…