当前位置: 首页 > news >正文

【Rust 学习笔记】Rust 基础数据类型介绍——数组、向量和切片

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持!
博主链接

博客内容主要围绕:
       5G/6G协议讲解
       高级C语言讲解
       Rust语言讲解



文章目录

  • Rust 基础数据类型介绍——数组、向量和切片
    • 一、数组、向量和切片
      • 1.1 数组
        • 1.1.1 数组的声明方法1
        • 1.1.2 数组的声明方法2
      • 1.2 向量
        • 1.2.1 向量分配方法1
        • 1.2.2 向量分配方法2
        • 1.2.3 向量分配方法3
        • 1.2.4 向量分配方法4
        • 1.2.5 向量内部实现介绍
        • 1.2.6 向量的基本操作
      • 1.3 切片

Rust 基础数据类型介绍——数组、向量和切片

       Rust中的数据类型如下所示,我会分多篇博客来介绍,下面先看一个总览:

类型简要说明
i8、i16、i32、i64、i128、u8、u16、u32、u64、u128给定位宽的有符号整数和无符号整数
isize、usize与机器字(32bit、64bit)一样大的有符号整数和无符号整数
f32、f64单精度IEEE浮点数和双精度IEEE浮点数
bool布尔值
charUnicode字符,32位宽(4字节)
()单元元组(空元组)
(char,u8,i32)元组(允许混合类型)
Box<Attend>指向堆中值的拥有型指针
&i32、&mut i32共享引用和可变引用,非拥有型指针,其生命周期不能超出引用目标
StringUTF-8字符串,动态分配大小
&str对str的引用,指向UTF-8文本的非拥有型指针
[f64;4]、[u8;256]数组,固定长度,其元素类型都相同
Vec[f64]向量,可变长度,其元素类型都相同
&[u8]、*mut [u8]对切片(数组或向量某一部分)的引用,包含指针和长度
Option<&str>可选值,或为None(无值),或者为Some(v)(有值,其值为v)
Result<u64, Error>可能失败的操作结果,或者为成功值OK(v),或者为错误值Err(e)
struct S { x: f32, y: f32 }具名字段型结构体
struct T(i32, char);元组型结构体
struct E;单元型结构体,无字段
enum Attend { OnTime, Late(u32)}枚举,或代数数据类型
&dyn Any、&mut dyn Read特型(trait)对象,是对任何实现了一组给定方法的值的引用
fn(&str)->bool函数指针
(闭包类型没有显式书写形式)闭包

一、数组、向量和切片

Rust使用三种类型来表示内存中的值序列:

  • 类型[T; N]表示N个值的数组,其类型为T。数据的大小是在编译期确定的,并且是类型的一部分,不能追加新元素或缩小数组
  • 类型Vec<T>可称为 T的向量,它是一个动态分配且可增长的T类型的值序列。向量元素存在于堆内存中,因此可以随意调整向量的大小;
  • 类型&[T]&mut [T]可称为T的共享切片T的可变切片,它们是对一系列元素的引用,这些元素可以是数据或向量的一部分。共享切片&[T] 允许在多个读者之间共享访问权限,但不允许修改元素;可变切片&mut [T] 允许读取和修改元素,但不能共享;

       给定这3种类型中的任意一种类型的值v,表达式v.len()会给出 v 中的元素数,而v[i]引用的是 v 中的第 i 个元素(i 的类型必须是 usize)。v的第一个元素是v[0],最后一个元素是v[v.len()-1]。Rust会检查 i 是否在正确的范围内,如果没有则会出现panic。

1.1 数组

1.1.1 数组的声明方法1

       可以在声明变量的同时,通过 方括号 来初始化一个数组。

fn main() {let array:[i32;3] = [2, 3, 5];println!("{:?}", array);assert_eq!(array.len(), 3);
}
1.1.2 数组的声明方法2

       对于一些较长的数组,需要填充一些值时,可以使用[V; N]方法,其中V是每个元素的值,N是长度。下面的代码声明了一个长度为300的数组,其中每个元素初始值为100。

fn main() {let mut array = [100; 300];for i in 1..array.len() {array[0] += array[i];}println!("array[0]={}", array[0]);assert_eq!(array.len(), 300);
}

       Rust中没有任何能定义未初始化数组的写法。且数组的长度是其类型的一部分,并会在编译器固定下来。如果n是变量,则不能写成 [100; n] 以期望得到一个包含 n 个元素的数组。当你需要一个长度在运行期可变的数组时,请使用向量。

       数组上看到的那些方法(遍历、查找、排序、填充、过滤等)都是作为切片而非数组的方法提供的。但Rust在搜索各种方法时会隐式地将对数组的引用转换为切片,因此可以直接在数组上调用任何切片的方法:

let mut chaos = [3, 5, 4, 1, 2];
chaos.sort();
assert_eq!(chaos, [1, 2, 3, 4, 5]);

上面的代码中sort()函数是定义在切片上的,但是由于它是通过引用获取的操作目标,因此Rust会隐式地生成一个整数组数的 &mut [i32] 切片,并将其传给 sort 来进行操作。

1.2 向量

       向量Vec<T>是一个可调整大小的T类型元素的数组,它是在堆上分配的。我们这里先介绍几种简单的分配向量的方法。

1.2.1 向量分配方法1

       使用vec!宏来分配向量,它使用起来感觉特别像数组:

fn main() {let vector = vec![1,2,30];println!("{}", vector.iter().product::<i32>());
}

与数组不同的是,我们可以动态地向它添加元素:

fn main() {let mut vector = vec![1,2,30];println!("{}", vector.iter().product::<i32>());vector.push(40);println!("{}", vector.iter().product::<i32>());
}
1.2.2 向量分配方法2

       还可以通过给定值重复一定次数来构建向量,可以再次使用模仿数组字面量的语法:

fn main() {let mut vector = vec![2;3];println!("{}", vector.iter().product::<i32>());
}
1.2.3 向量分配方法3

       vec! 宏相当于调用 Vec::new来创建一个新的空向量,然后将元素压入其中,例如下面的代码:

fn main() {let mut vector = Vec::new();vector.push(3);vector.push(7);vector.push(9);println!("{}", vector.iter().product::<i32>());
}
1.2.4 向量分配方法4

       还有一种方法是从迭代器生成的值构建一个向量:

fn main() {let vector:Vec<i32> = (1..5).collect();println!("{}", vector.iter().product::<i32>());
}

使用collect时,通常需要指定类型,因为它可以构建出不同种类的集合,而不仅仅是向量。通过指定vector的类型,我们明确表达了自己想要哪种集合。

与数组类型一样,可以对向量使用切片的方法:

fn main() {let mut palindrome = vec!["a man", "a plan", "a canal", "panama"];palindrome.reverse();println!("{:?}", palindrome);
}

上面的代码中,reverse方法实际上是在切片上定义的,但是此调用会隐式地从此向量中借用一个 &mut [&str] 切片并在其上调用reverse。

1.2.5 向量内部实现介绍

       Vec<T>是由3个值组成的:

  • 指向元素在堆中分配的缓冲区的指针;
  • 缓冲区能够存储的元素数量,即向量容量;
  • 目前实际包含的元素数量,也就是它的长度;

当缓冲区达到其最大容量时,往向量中添加另一个元素需要分配一个更大的缓冲区,将当前内容复制到其中,更新向量的指针和向量容量以指向新缓冲区,最后释放旧缓冲区

       如果事先知道向量元素数量,就可以调用Vec::with_capacity而不是Vec::new来创建一个向量,它的缓冲区足够的大,可以从一开始就容纳所有的元素,然后将所有元素逐个添加到向量中,而不会导致任何重新分配。当然,如果实际的元素数量超出了预估的数量,还是会重新分配缓冲区的。

vec!宏就使用了上面的技巧,因为它知道最终向量将包含多少个元素。

       向量的len方法会返回它现在包含的元素数,而capacity方法则会返回在不重新分配的情况下可以容纳的元素数:

fn main() {let mut vector:Vec<i32> = Vec::with_capacity(2);println!("len is {}", vector.len());println!("capacity is {}", vector.capacity());vector.push(2);vector.push(3);println!("len is {}", vector.len());println!("capacity is {}", vector.capacity());vector.push(4);println!("len is {}", vector.len());println!("capacity is {}", vector.capacity());
}

上面代码的运行结果如下图,最后打印出的容量大小不能保证恰好为4,但至少大于等于3,因为此向量包含3个元素。
在这里插入图片描述

1.2.6 向量的基本操作

       可以在向量中任意位置插入元素和移除元素,不过这些操作会将受影响位置之后的所有元素向前或向后移动,因此如果向量很长就可能很慢

       下面的代码展示在恰当位置插入一个元素的insert方法和删除一个恰当位置元素的remove方法:

fn main() {let mut v = vec![10, 20, 30, 40, 50];println!("{:?}",v);// 在索引为3的元素处插入35v.insert(3, 35);println!("{:?}",v);// 移除索引为1的元素v.remove(1);println!("{:?}",v);
}

       下面的代码展示使用push方法在向量末尾添加一个元素,和pop方法移除向量中的最后一个元素并返回其值:

fn main() {let mut v = vec!["Snow Puff", "Glass Gem"];println!("remove {:?}, current value is {:?}",v.pop(),v);println!("remove {:?}, current value is {:?}",v.pop(),v);println!("remove {:?}, current value is {:?}",v.pop(),v);
}

上面代码运行结果为:
在这里插入图片描述

由上面的执行结果可以看到,pop方法返回的值是一个Option<T>类型,如果:

  • 向量为空,则返回None
  • 如果其最后一个值为 v ,则返回Some(v)

1.3 切片

       切片是数组和向量中的一个区域,写作[T]。由于切片可以是任意长度的,因此它不能直接存储在变量中或作为函数参数传递。切片总是通过引用传递。对切片的引用是一个胖指针

  • 双字值;
  • 第一个字是指向切片中第一个元素的指针;
  • 第二个字是切片中元素的数量;

执行下面代码后的内存布局如下图所示。

fn main() {let v: Vec<f64> = vec![0.0,  0.707,  1.0,  0.707];let a: [f64; 4] =     [0.0, -0.707, -1.0, -0.707];let sv: &[f64] = &v;let sa: &[f64] = &a;
}

上面最后两行代码,将&Vec<f64>&[f64; 4]转换为直接指向数据的切片引用。

请添加图片描述

       普通引用是指向单个值的非拥有型指针,而切片的引用是指向内存中一系列连续值的非拥有型指针。如果要写一个对数组和向量进行操作的函数,那么切片引用就是不错的选择。例如下面的代码:

fn main() {let v: Vec<f64> = vec![0.0,  0.707,  1.0,  0.707];let a: [f64; 4] =     [0.0, -0.707, -1.0, -0.707];fn print(n: &[f64]) {for elt in n {println!("{}", elt);}}print(&a);  // 打印数组print(&v);  // 打印向量
}

       还可以使用范围值对数组或向量进行索引,以获取一个切片的引用,该引用既可以指向数组或向量,也可以指向一个既有切片:

print(&v[0..2])	 //打印v的前两个元素
print(&a[2..])   //打印从a[2]开始的元素
print(&sv[1..3]) //打印v[1]和v[2]

与普通数组访问一样,Rust会检查索引是否有效。尝试访问超出数组末尾的切片会导致panic

       由于切片几乎总是出现在引用符号之后,因此通常只将 &[T] 或 &str 之类的类型称为切片



在这里插入图片描述

相关文章:

【Rust 学习笔记】Rust 基础数据类型介绍——数组、向量和切片

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 博客内容主要围绕&#xff1a; 5G/6G协议讲解 高级C语言讲解 Rust语言讲解 文章目录 Rust 基础数据类型介绍——数组、向量和切片一、数组、向量和…...

2024年特别报告,「十大生活方式」研究数据报告

“一朵花成轻奢品、一只玩偶掀抢购狂潮、一片荒地变文旅圣地…” 近年爆火的野兽派、Jellycat、阿那亚等诸多品牌&#xff0c;与消费者选择的生活方式息息相关。 今年小红书的内容种草、直播电商&#xff0c;也都依循着“生活方式”的轨迹。生活方式的价值所向&#xff0c;可…...

R中单细胞RNA-seq分析教程 (5)

引言 本系列开启R中单细胞RNA-seq数据分析教程[1]&#xff0c;持续更新&#xff0c;欢迎关注&#xff0c;转发&#xff01; 10. 伪时间细胞排序 如前所述&#xff0c;在 UMAP 嵌入中看到的背侧端脑细胞形成的类似轨迹的结构&#xff0c;很可能代表了背侧端脑兴奋性神经元的分化…...

openpnp - Too many misdetects - retry and verify fiducial/nozzle tip detection

文章目录 openpnp - Too many misdetects - retry and verify fiducial/nozzle tip detection概述笔记环境光最好弱一些在设备标定时&#xff0c;吸嘴上不要装绿色屏蔽片如果吸嘴不在底部相机中间&#xff0c;先检查设置底部相机坐标调整底部相机坐标 吸嘴校验的细节底部相机坐…...

不与最大数相同的数字之和

不与最大数相同的数字之和 C语言代码C 语言代码Java语言代码Python语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输出一个整数数列中不与最大数相同的数字之和。 输入 输入分为两行&#xff1a; 第一行为N(N为接下来数的个数&…...

CSS学习记录11

CSS布局 - display属性 display属性是用于控制布局的最终要的CSS属性。display 属性规定是否/如何显示元素。每个HTML元素都有一个默认的display值&#xff0c;具体取决于它的元素类型。大多数元素的默认display值为block 或 inline。 块级元素&#xff08;block element&…...

D95【python 接口自动化学习】- pytest进阶之fixture用法

day95 pytest的fixture详解&#xff08;二&#xff09; 学习日期&#xff1a;20241210 学习目标&#xff1a;pytest基础用法 -- pytest的fixture详解&#xff08;二&#xff09; 学习笔记&#xff1a; fixture(autouseTrue) func的autouse是TRUE时&#xff0c;所有函数方法…...

Abaqus断层扫描三维重建插件CT2Model 3D V1.1版本更新

更新说明 Abaqus AbyssFish CT2Model3D V1.1版本更新新增对TIF、TIFF图像文件格式的支持。本插件用户可免费获取升级服务。 插件介绍 插件说明&#xff1a; Abaqus基于CT断层扫描的三维重建插件CT2Model 3D 应用案例&#xff1a; ABAQUS基于CT断层扫描的细观混凝土三维重建…...

隐式对象和泛型

implicit object 作用&#xff1a; case class DatabaseConfig(driver:String,url:String)//作为函数的隐士参数的默认值implicit object MySqlDefault extends DatabaseConfig("mysql","localhost:443")def getConn(implicit config: DatabaseConfig):Uni…...

CSS的颜色表示方式

以下介绍几种常见的CSS颜色表示方式&#xff1a; 颜色名称 html和css规范中定义了147种可用的颜色名用的相对较少 16进制表示 css三原色&#xff1a;红、绿、蓝16进制的颜色值&#xff1a; #rrggbb16进制整数规定颜色成分&#xff0c;所有的值均介于 00 - ff 之间&#xff…...

单链表常见面试题 —— LeetCode

一.删除链表中与val相等的所有节点 1.题目描述 ----- 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 列表中的节点数目在范…...

Pydantic中的discriminator:优雅地处理联合类型详解

Pydantic中的discriminator&#xff1a;优雅地处理联合类型详解 引言1. 什么是discriminator&#xff1f;2. 基本使用示例3. discriminator的工作原理4. 更复杂的实际应用场景5. 使用建议6. 潜在陷阱和注意事项结论最佳实践 引言 在Python的类型系统中&#xff0c;有时我们需要…...

pgloader SQLSERVER -> PostgreSQL 配置文件样例

pgloader 是什么&#xff1f;安装和基本用户法可以去其他同道的blog上去看&#xff0c;这里不占用网络空间了。刚开始用官方的文档读起还是很费劲的&#xff0c;所以把常用的配置例子放在这里。 官方文档&#xff1a;https://pgloader.readthedocs.io/en/latest/index.html 迁…...

APP、小程序对接聚合广告平台,有哪些广告变现策略?

开发者对接聚合广告平台&#xff0c;可以让自身流量价值最大化&#xff0c;获得更多的广告曝光机会&#xff0c;对接单一的广告联盟容易造成广告填充不足&#xff0c;收益不稳定的问题。#APP广告变现# APP开发者根据应用的生命周期、用户特征和产品定位&#xff0c;选择最适合…...

HarmonyOs DevEco Studio小技巧39-模拟器的使用

使用环境 模拟器在本地计算机上创建和运行&#xff0c;在运行和调试应用/元服务时可以保持良好的流畅性和稳定性&#xff0c;但是需要耗费一定的计算机资源&#xff0c;具体的运行环境要求为&#xff1a; 系统类型 运行环境要求 Windows(X86) Windows 10 企业版、专业版或教…...

【C语言】浮点数的原理、整型如何转换成浮点数

众所周知C语言中浮点数占四个字节&#xff0c;无论在32位或者64位机器上。不免会发出疑问四个字节是怎么计算出小数的呢&#xff1f;其实物理存放还是按照整型存放的。 IEEE 754 单精度浮点数格式 浮点数在计算机中是使用 IEEE 754 标准进行表示的。在 IEEE 754 标准中&#…...

TesseractOCR-GUI:基于WPF/C#构建TesseractOCR简单易用的用户界面

前言 前篇文章使用Tesseract进行图片文字识别介绍了如何安装TesseractOCR与TesseractOCR的命令行使用。但在日常使用过程中&#xff0c;命令行使用还是不太方便的&#xff0c;因此今天介绍一下如何使用WPF/C#构建TesseractOCR简单易用的用户界面。 普通用户使用 参照上一篇教…...

Elasticsearch高性能实践

前言 本方案主要从运维层面分析es是实际生产使用过程中的参数优化&#xff0c;深入理解es各个名词及含义&#xff0c;深入分析es的使用过程中应注意的点&#xff0c;详细解释参数设置的原因以及目的&#xff0c;主要包括系统层面&#xff0c;参数层面。除此之外&#xff0c;优…...

软件测试--录制与回放脚本

准备工作 安装phpstudy 配置两个内容 放demo44文件夹 在浏览器输入http://localhost/demo44/index.html&#xff0c;出现如图所示的网站 输入用户名和密码 步骤一&#xff1a;打开Virtual User Generator&#xff0c;点击新建&#xff0c;点击new 步骤二&#xff1a;点击如下…...

nodejs 06.npm的使用以及package.json详解

一.npm(npm | Home)的介绍 npm(Node Package Manager)是一个node.js的包管理工具,允许用户下载安装更新分享node.js包 二.npm相关命令以及作用 1.npm init -y 这条命令主要是当项目中没有package.json这个文件的时候生成package.json这个文件 2.npm i / npm install (包名) 这条…...

如何使用WinCC DataMonitor基于Web发布浏览Excel报表文档

本文介绍使用 WinCC DataMonitor 的 "Excel Workbooks" 功能&#xff0c;通过 Excel 表格显示 WinCC 项目的过程值、归档变量值和报警归档消息。并可以通过 Web 发布浏览访问数据 1&#xff0e;WinCC DataMonitor是什么 ? DataMonitor 是 SIMATIC WinCC 工厂智能中…...

颜色的基本处理

数码相机能够获取彩色图像&#xff0c;但相机的色彩处理是一个非常复杂的过程&#xff0c;是非常重要的。 此过程生产制造商在细节方面都是不公布的&#xff0c;但是基本的概念是相同的。当相机捕捉一个真实场景时&#xff0c;是怎么还原成人眼所看到的图像呢&#xff1f; 1.R…...

跟李笑来学美式俚语(Most Common American Idioms): Part 66

Most Common American Idioms: Part 66 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记&#xff0c;自用。 Github仓库链接&#xff1a;https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来&#xff08;或者clone到本地…...

爬虫技术简介

1、爬虫简介 爬虫(Web crawler)是一种用于自动获取网页内容的程序。它可以通过模拟浏览器访问网页,并从中提取所需的信息,如文本、图片、链接等。爬虫在互联网上进行广泛应用,用于搜索引擎的网页抓取、数据挖掘、信息收集、内容监测等领域。 2、爬虫分类 爬虫的分类有以…...

如何打开Windows10的设备管理器

如何打开Windows10的设备管理器&#xff1f; 01 02...

scala列表

1 不可变 List 说明 &#xff08;1&#xff09;List 默认为不可变集合 &#xff08;2&#xff09;创建一个 List&#xff08;数据有顺序&#xff0c;可重复&#xff09; &#xff08;3&#xff09;遍历 List &#xff08;4&#xff09;List 增加数据 &#xff08;5&#…...

c++检查某一文件是否存在

C17及以上版本&#xff0c;检查文件是否存在可以使用filesystem库 如果使用的是C11或C14&#xff0c;标准库并没有直接提供这样的功能。 可以使用平台特定的API&#xff0c;例如在Windows上使用 _access 函数&#xff0c;或在POSIX兼容系统&#xff08;如Linux和macOS&#x…...

Scala的隐式类,隐式参数和值,隐式对象

1.Scala的隐式类定义语法&#xff1a;implicit class 类名(参数){ } 隐式类中参数只能定义一个&#xff0c;参数中的源类型与目标类型一一对应&#xff0c;只能从一种类型转换成另一种类型&#xff0c;不可以一对多或多对。 //隐式类&#xff1a;implicit class隐式转换函…...

LabVIEW实现HTTP通信

目录 1、HTTP通信原理 2、硬件环境部署 3、云端环境部署 4、HTTP通信函数 5、程序架构 6、前面板设计 7、程序框图设计 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和…...

【EXCEL】 获取多列中 不为空的那一个数据

从多个表格筛选出来的上班时间是下表这样的 我要把他们放在同一列&#xff0c;这样方便后续处理&#xff0c;合并列输入下面这个公式即可 日期不加 TEXT&#xff08;&#xff09; 函数 转日期格式&#xff1b;将得到是一串数字 TEXT(TEXTJOIN(", ",TRUE,B2:F2),&qu…...

可以做彩票广告的网站吗/百度app打开

如果把西游记倒过来看。 如来派师徒四人与八部天龙小白龙去东土大唐去传教,在一路上遇到了各种妖怪,打来打去发现他们都是有后台的,无论怎么作恶都不受惩罚&#xff0c;八戒和沙僧觉得太黑 暗了,无奈一个躲进了高老庄,一个钻进了流沙河,只有悟空坚持正义一路斩妖除魔护送师傅东…...

江都住房和建设局网站/聊石家庄seo

最近在完成移动智能终端安全的课程实验时研究了一下smali的语法&#xff0c;顺便记录一下几个比较具有迷惑性的地方 比如以下两行代码&#xff1a; invoke-virtual {p0, v0}, Lcom/example/smali/MainActivity;->setContentView(I)V 复制代码iput-object v0, p0, Lcom/examp…...

潍坊网站设计制作/网站建设公司开发

20145238荆玉茗-《网络攻防》-信息搜集与漏洞扫描 实践过程记录 一、信息收集技术 &#xff08;一&#xff09;whois&#xff0c;dig&#xff0c;nslookup 使用whois cnblogs.com可以查看网站的服务器、注册人信息等&#xff0c;whois就像百度一样&#xff0c;只不过比它更加强…...

网站推广对企业的优势/网站搜索引擎优化主要方法

fackbook创始人爱读的两本 百年孤独 http://blog.csdn.net/c1782746138/article/details/47419827...

深入解析wordpress 下载/公司推广策划方案

作者&#xff1a;gfree.windgmail.com 博客&#xff1a;blog.focus-linux.net linuxfocus.blog.chinaunix.net 本文的copyleft归gfree.windgmail.com所有&#xff0c;使用GPL发布&#xff0c;可以自由拷贝&#xff0c;转载。但转载请保持文档的完整性&#xff0c;注明原作者及…...

保定网络公司建设网站/北京昨天出啥大事了

传送门&#xff1a;吉哥系列故事——完美队形II 马拉车的简单变形&#xff0c;如果不懂Manacher算法请移步&#xff1a;Manacher算法讲解 AC CODE #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace…...