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

洛谷 P13270:【模板】最小表示法 ← 双指针 + 解环成链

【题目来源】
https://www.luogu.com.cn/problem/P13270

【题目描述】
若长度为 n 的字符串 s 中可以选择一个位置 i,使得 si…sns1·si-1=t,则称 s 与 t 循环同构。字符串 s 的最小表示为与 s 循环同构的所有字符串中字典序最小的字符串。
给定一个长度为 n 的字符串 s,请求出 s 的最小表示。

【输入格式】
第一行一个整数 n。
第二行一个长度为 n 的字符串 s。​​​​​​​

【输出格式】
一行,一个字符串,为 s 的最小表示。​​​​​​​

【输入样例】
10
caacabcaab​​​​​​​

【输出样例】
aabcaacabc​​​​​​​

【数据范围】
对于全部数据,1≤n≤10^7,字符串 s 仅包含小写英文字母(ASCII 97~122)。
设置以下三档部分分,用于测试不同解法:
● 对于 20% 的数据,n≤10^3;
● 对于 50% 的数据,n≤10^5;
● 对于 100% 的数据,无特殊限制。

【算法分析】
● 本题代码与“洛谷 P1368:工艺(https://www.luogu.com.cn/problem/P1368)”基本一致。
● 本题是寻找字符串(或序列)最小表示的经典问题。
● 算法原理:利用数组倍增处理环形结构,或称之为解环成链,即将环形结构转为其 2 倍长度的线性结构。通过 while 循环进行双指针比较,i 和 j 分别代表当前竞争最小起始点的两个候选下标。当发现失配时,根据大小关系利用性质 i+=k+1 或 j+=k+1 快速跳过不可能成为答案的区间,从而实现线性扫描。最终输出从 min(i, j) 开始的 n 个元素。

【算法代码】

#include<bits/stdc++.h>
using namespace std;typedef long long LL;
const LL maxn=2e7+5;
char a[maxn];
int n;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;for(int i=0; i<n; i++) {cin>>a[i];a[i+n]=a[i]; //auxiliary sequence of length 2n}int i=0,j=1; //Two starting positionsint k=0; //Indicates the offsetwhile(i<n && j<n && k<n) {if(a[i+k]==a[j+k]) k++;else {if(a[i+k]>a[j+k]) i+=k+1;else j+=k+1;if(i==j) i++;k=0;}}int p=min(i,j);for(int q=0; q<n; q++) {cout<<a[p+q];}return 0;
}/*
in:
10
caacabcaabout:
aabcaacabc
*/





【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/157876099
https://oi-wiki.org/string/lyndon/
https://www.luogu.com.cn/article/lt2rnl6d
 

http://www.jsqmd.com/news/359574/

相关文章:

  • 260208明天就要回家了
  • 知行合一与变通:徐阶用一生证明,真正的心学从不是迂腐死守
  • python自定义迭代器
  • Python 标准库全景图
  • 【计算机毕业设计】基于Spring Boot+Vue智能水产养殖管理系统的设计与实现+LW
  • 【无人机追踪】基于 0-1 整数规划实现「能耗最小」的无人机联盟选取,完成目标攻击任务的同时,让所有无人机的总能耗达到最优附Matlab代码
  • 260208
  • 【路径规划】基于RRT算法实现在极其困难的随机迷宫中为车辆规划路径以到达目标附matlab代码
  • 【数据分析】DMK扩散映射卡尔曼、观测器、粒子滤波PF三种方法的数据驱动动态系统分析附matlab代码
  • 【故障诊断】粒子群优化PSO优化随机森林RF和支持向量机SVM(PSO-SVMPSO-RF),用于优化基于人工智能的矿产前景制图附matlab代码
  • OpenClaw-VSCode:在 VS Code 中通过 WebSocket 远程管理 OpenClaw 网关的完整方案
  • 2.7 2.8
  • 指数狂想与智慧守正:库兹韦尔五大预言的贾子理论批判与文明边界裁决
  • AI原生应用领域中混合推理的多模态融合技术
  • 从单体到微服务:AI架构师详解大规模AI系统部署的架构演进路径与策略
  • Flutter for OpenHarmony Python学习助手实战:代码测试与质量保证的实现
  • Obsidian如何使用Claude Code+Skills
  • JAVA WEB的初步学习
  • abc 9
  • 中心化交易所头部垄断成趋势,Hyperliquid永续合约真能挑战当前局面?
  • Flutter for OpenHarmony Python学习助手实战:API接口开发的实现
  • Prometheus告警处理详解:从Alertmanager部署到告警实战
  • Gitee迁移GitHub开源全攻略:一键配置自动同步,仅需维护单一仓库
  • 下载git不在默认c盘时tortoiseGit安装后右键没有出现Git Clone… Git Create repository here…以及TotoiseGit时的解决方法
  • 基于ThinkPHP5开发的ERP进销存与仓储管理PHP源码系统
  • 科研数据分析不卡壳!虎贲等考 AI 一键搞定实证分析,零基础也能出专业结果
  • 企业级资产管理系统源码|Java+Vue全栈开发,含移动端支持
  • 开题报告不用反复改!虎贲等考 AI 一键搭框架,导师直呼专业
  • 基于SpringBoot的车辆信息管理平台(含完整源码、数据库脚本、毕业论文及答辩PPT)
  • 软著材料整理怎么做更快:从项目描述到可导出初稿(软著通)