【算法】竞赛常用知识之字符串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;
	}
}

三者对比

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux中云盘/磁盘,爆满处理方式

1&#xff1a;du和df命令查看磁盘大小不一致 以下是阿里云服务器云盘使用率 运行 du -sh / 大小为20g 我的服务器大小为40g 按道理说这个云盘使用率应该是百分之五十 而运行 df -h / 这个命令是跟这个云盘使用率差不多的。 1.1分析原因 我安装了mysql&#xff0c;nginx…

47岁古天乐唯一承认女友约「御用阿妈」过母亲节

日前关宝慧在IG晒出一张聚会照&#xff0c;并写道&#xff1a;「预祝各位#母亲节快乐&#x1f339;#dinner #happy #friends #好味」相中所见&#xff0c;前TVB金牌监制潘嘉德、卢宛茵、黄&#x28948;莹、黎萨达姆都有出席饭局。 当中黄&#x28948;莹身穿卡其色西装褛&…

从“制造”到“智造”:“灯塔”经验助力中国制造业转型升级-转载

作者&#xff1a;Karel Eloot&#xff0c;侯文皓&#xff0c;Francisco Betti&#xff0c;Enno de Boer和Yves Giraud 作为中国实体经济的主体&#xff0c;制造业是推动中国经济发展乃至全球制造业持续增长的重要引擎。站在历史与未来交汇的新起点上&#xff0c;中国制造业将背…

ERP与MES与WMS集成

WMS储位管理 WMS与MES集成 (一) 打通追溯链 在拣货时&#xff0c;将配料标签与供应商的物料标签进行关联。通过配料标签达到精确追溯及防错目的。针对模糊查询&#xff0c;将工单与物料的供应商信息、仓库流转信息进行关联。 (二) WMS入库 成品(半成品)下线后&#xff0c;M…

MySQL查询篇-聚合函数-窗口函数

文章目录 distinct 关键字聚合函数常见的聚合函数group by和having 分组过滤 窗口函数with as窗口聚合函数排名窗口函数值窗口函数 distinct 关键字 distinct 去重数据&#xff0c;ps:null值也会查出来 select distinct column from table;聚合函数 常见的聚合函数 select …

【前端系列】什么是yarn

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

浅谈@Controller注解和其他四大注解的区别

各位大佬光临寒舍&#xff0c;希望各位能赏脸给个三连&#xff0c;谢谢各位大佬了&#xff01;&#xff01;&#xff01; 目录 1.Spring五大注解的使用约定 2.Controller注解的特别之处 3.总结 1.Spring五大注解的使用约定 Spring的五大注解&#xff08;Controller&#x…

【无标题】能效?性能?一个关于openssl speed速度测试的诡异问题。

问题描述 最近的某个软件用到了openssl&#xff0c;所以就想着测试一下速度。我的电脑是惠普的&#xff0c;CPU是AMD Ryzen 7 PRO 6850HS&#xff0c;系统是Win11。我使用openssl自带的speed测试加密/解密的速度&#xff0c;命令大致如下&#xff1a; openssl speed -evp aes…

python数据分析——matplotlib可视化基础

参考资料&#xff1a;活用pandas库 # 导入库 import pandas as pd import matplotlib.pyplot as plt # 导入数据 anscombepd.read_csv(r"...\seaborn常用数据案例\anscombe.csv") anscombe.head() 大多数基本图表的名字以plt.plot开头。 # 创建数据子集 # 只包含数…

电力场景设备漏油检测数据集VOC+YOLO格式338张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;338 标注数量(xml文件个数)&#xff1a;338 标注数量(txt文件个数)&#xff1a;338 标注类别…

linux学习:视频输入+V4L2

目录 V4L2 视频采集流程 代码例子 核心命令字和结构体 VIDIOC_ENUM_FMT VIDIOC_G_FMT / VIDIOC_S_FMT / VIDIOC_TRY_FM VIDIOC_REQBUFS VIDIOC_QUERYBUF VIDIOC_QBUF /VIDIOC_DQBUF VIDIOC_STREAMON / VIDIOC_STREAMOFF V4L2 是 Linux 处理视频的最新标准代码模块&…

Hadoop3.4.0 完全分布式集群 运行环境搭建 VMware Workstation 虚拟机 大数据系列 一

一 生产环境集群模式部署&#xff0c;需要多台主机&#xff0c;主机之间通过密钥相互访问. 1 配置如图 节点名字节点IP系统版本master11192.168.50.11centos 8.5slave12192.168.50.12centos 8.5slave13192.168.50.13centos 8.5 2 安装服务器 #先安装一台master11&#xff…

读人工智能时代与人类未来笔记01_重塑人类社会秩序

1. AlphaZero 1.1. 2017年年底&#xff0c;由谷歌旗下DeepMind公司开发的人工智能程序AlphaZero击败了当时世界上最强大的国际象棋程序Stockfish 1.1.1. AlphaZero对Stockfish的百场战绩是28胜72平0负&#xff0c;可以说获得了压倒性的胜利 1.1.2. …

手撕C语言题典——反转链表

目录 前言 一.思路 1&#xff09;创建新链表 2&#xff09;创建三个指针 二.代码实现 搭配食用更佳哦~~ 数据结构之单单单——链表-CSDN博客 数据结构之单链表的基本操作-CSDN博客 前面学了单链表的相关知识&#xff0c;我们来尝试做一下关于顺序表的经典算法题~ 前言 反转…

RocketMQ(一)

作用 1. 限流削峰 2. 异步解耦 组成 Producer&#xff1a;消息的发送者&#xff0c;生产者&#xff1b;举例&#xff1a;发件人 Consumer&#xff1a;消息接收者&#xff0c;消费者&#xff1b;举例&#xff1a;收件人 Broker&#xff1a;暂存和传输消息的通道&#xff1…

C语言 | Leetcode C语言题解之第85题最大矩形

题目&#xff1a; 题解&#xff1a; int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize) {int m matrixSize;if (m 0) {return 0;}int n matrixColSize[0];int left[m][n];memset(left, 0, sizeof(left));for (int i 0; i < m; i) {for (int j …

---随笔--Java实现TCP通信(双端通信接收与发送)

---随笔--Java实现TCP通信&#xff08;双端通信接收与发送&#xff09; 引言1. 什么是TCP通信2. 服务器与客户端核心代码2.1 服务器ServerSocket端核心代码2.2 用户Socket端核心代码2.3 小贴士之关于try-with-resources自动关闭资源的使用 3. 具体服务器端实现4. 具体客户端实现…

LLM量化

Efficient Finetuning prefix tuning 针对每种任务&#xff0c;学习prefix vector 启发于prompting&#xff0c;调整上下文内容让模型去输出自己想要的内容 核心就是找到一个上下文去引导模型解决NLP生成任务 传统情况下&#xff0c;我们为了得到想要的结果&#xff0c;会…

jdk8的新特征

1&#xff1a; jdk8中新增的方法 在jdk8中对接口进行了增强&#xff0c;在jdk8之前 interface 接口名{ 静态常量&#xff1a; 抽象方法&#xff1a; } 在jdk8之后 interface 接口名{ 静态常量&#xff1a; 抽象方法&#xff1a; 默认方法&#xff1a; 静态方法&#xff1a; } 2…

Ubuntu20.4部署Cuda12.4

准备Ubuntu20.4 VM 安装Cuda12.4 1.进入如下界面安装安装Cuda12.4版本&#xff1a; CUDA Toolkit 12.4 Update 1 Downloads | NVIDIA Developerhttps://developer.nvidia.com/cuda-downloads?target_osLinux&target_archx86_64&DistributionUbuntu&target_vers…