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

news2024/11/30 14:38:49

前言:

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

董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (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.coloradmin.cn/o/1667743.html

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

相关文章

Mybatis-Plus大批量插入数据到MySQL

MyBatis-Plus的saveBatch方法 GetMapping("/save1") public void save1() {// 数据准备List<MallOrder> orderList getMallOrderList();// mybatis-pluslong start System.currentTimeMillis();mallOrderService.saveBatch(orderList);System.out.println(&…

java中EQ、NE、GE、GT、LE、LT

关系运算符 包括EQ、NE、GE、GT、LE、LT几个&#xff0c;关系运算符返回的是真“True”或假“False”。 eq&#xff08;Equal to&#xff09; 等 运算符 &#xff0c;如果运算符两边相同则返回真&#xff0c;否则返回假&#xff1b; ne&#xff08;Not Equal to&#xff09; 不…

美术:模型动画

游戏模型制作流程&#xff0c;SP和BP根据情况来选择软件对UV进行处理 3Dmax 制作模型和动画&#xff08;橘肉&#xff09;RizomUV 对模型进行展UV&#xff08;橘皮&#xff09;Substance Painter 纹理手绘&#xff08;给橘皮制定想要的皮肤&#xff09;BodyPaint 3D 纹理手绘&a…

Hive Transaction事务表(含实现原理)

Hive Transaction事务表 在Hive中&#xff0c;事务表&#xff08;Transactional Tables&#xff09;允许用户执行事务性操作&#xff0c;包括ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;特性。事务表是在Hive 0.14版本引入的&#xff0c;并且在后续版本中不断…

最新的云渲染100活动有哪些?渲染100邀请码1a12

随着科技的进步&#xff0c;云渲染已经成为设计行业的必备工具&#xff0c;各个云渲染平台为了吸引用户也推出各种各样的活动&#xff0c;今天我们以广受好评的渲染100为例&#xff0c;来说下它们的活动体系。 1、新用户活动 渲染100对新用户很友好&#xff0c;提供了充足的测…

PyTorch的卷积和池化

卷积计算 input 表示输入的图像filter 表示卷积核, 也叫做滤波器input 经过 filter 的得到输出为最右侧的图像&#xff0c;该图叫做特征图 卷积的计算是将卷积核放入左上角&#xff0c;在局部区域间做点积&#xff0c;然后将卷积核在Input上面依次从左向右&#xff0c;从上到下…

STM32串口通信入门

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

LeetCode—用队列实现栈

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

深圳晶彩智能ESP32-1732S019实时观看GPIO的状态

深圳晶彩智能ESP32-1732S019介绍 ESP32-1732S019开发板是基于ESP32-S3-WROOM-1模块作为主控&#xff0c;双核MCU ,集成WI-FI和蓝牙功能&#xff0c;主控频率可达240MHz , 512KB SRAM , 384KB ROM&#xff0c;8M PSRAM&#xff0c;16MB Flash&#xff0c;显示分辨率为170*320 I…

冯喜运:5.12黄金回撤继续上涨,下周原油走势分析

【黄金消息面分析】&#xff1a;本周&#xff0c;黄金市场迎来了自4月中旬以来的最佳单周表现。周五&#xff08;3月9日&#xff09;&#xff0c;金价攀升至2360.54美元/盎司&#xff0c;涨幅0.62%&#xff0c;而纽约商品交易所6月交割的黄金期货价格上涨1.5%&#xff0c;收报2…

Springboot+Vue项目-基于Java+MySQL的毕业就业信息管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

其他的 框架安全:Apache Shiro 漏洞序列.(CVE-2016-2807)

什么是 Apache Shiro Apache Shiro 是一个强大且易用的Java安全框架&#xff0c;它为应用程序提供了身份验证、授权、加密和会话管理等常见的安全功能。漏洞大多会发生在登录处&#xff0c;返回包里包含remeberMedeleteMe字段.&#xff08; Shiro 这个属于第三方的&#xff0c…

表的创建与操作表

1. 创建表 创建表有两种方式 : 一种是白手起家自己添&#xff0c;一种是富二代直接继承. 2. 创建方式1 (1). 必须具备条件 CREATE TABLE权限存储空间 (2). 语法格式 CREATE TABLE IF NOT EXISTS 表名(字段1, 数据类型 [约束条件] [默认值],字段2, 数据类型 [约束条件] [默…

Spring高手之路18——从XML配置角度理解Spring AOP

文章目录 1. Spring AOP与动态代理1.1 Spring AOP和动态代理的关系1.2 AOP基本术语 2. 通过XML配置实现Spring AOP2.1 添加Spring依赖2.2 定义业务接口和实现类2.3 定义切面类2.4 配置XML 1. Spring AOP与动态代理 1.1 Spring AOP和动态代理的关系 Spring AOP使用动态代理作为…

用 Python 和 AkShare 进行个股数据清洗:简易多功能方法

标题:用 Python 和 AkShare 进行个股数据清洗:简易多功能方法 简介: 本文介绍了如何使用 Python 和 AkShare 库对个股数据进行清洗和处理。个股数据经常需要进行清洗以用于分析、建模或可视化。我们将介绍一些简单但功能强大的方法,包括数据加载、缺失值处理、重复值检测和…

Gitlab:从其它项目组里导入一个项目

1.首先获取原项目的http地址 http://ip/projectGroup/ProjectX.git其中&#xff0c;ip 为公司gitlab内网地址。 2.进入目的项目组进行创建 首先&#xff0c;需要拥有一个该组拥有者权限的账号&#xff0c;才能进行后续的操作。 2.1.点击创建项目按钮 2.2.选择导入项目 其中…

03c++重载运算符

1、深入理解new和delete原理 #include<iostream> using namespace std;/* new 和 delete 1、malloc和new的区别 new 内存开辟构造函数 2、free和 delete的区别 delete 内存回收析构函数 开辟失败malloc返nullptr ,new抛出bad_alloc异常new->operator new delete -&…

Docker学习(带图详细)

一、安装docker 参考官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 查看系统版本 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# [rootlocalhost ~]# uname -a Linux localhost.localdomai…

STM32平衡车-MPU6050的DMP库移植

本文目录 一、硬件接线二、需要移植的三个文件夹1. DMP文件夹目录2. IIC文件夹目录3. MPU6050文件夹目录 三、文件内容IO12C.cIO12C.hMPU6050.cMPU6050.hmain.c 四、附录1.更改IIC引脚 一、硬件接线 SCL-- PA11 SDA-- PA12 VCC-- 3.3v GND-- GND INT-- PC9 二、需要移植的三个…

[Kubernetes] Istio on Kubernetes 实践

文章目录 1.Kubernetes 创建2.Istio 部署2.1 下载 Istio2.2 安装 Istio 3.Istio on Kubernetes 实践3.1 部署 Bookinfo 示例应用3.2 确定入站 IP 和端口 1.Kubernetes 创建 主机名内部ip外部ipmaster192.168.66.2139.198.36.40node1192.168.66.3139.198.1.192node2192.168.66.…