UVa 12451 Let‘s call SPaDe a SPaDe

发布时间:2026/9/12 11:06:11

UVa 12451 Let‘s call SPaDe a SPaDe 题目描述给定一个由小写字母{a, b, c, d}构成的字符串SSS5≤∣S∣≤1005 \le |S| \le 1005≤∣S∣≤100可以对其进行一级压缩将任意连续子串用(X)k的形式表示其中XXX是任意非空字符串kkk是重复次数k≥2k \ge 2k≥2并且压缩不能嵌套即压缩后的串中不能再包含( ... )结构。我们的目标是通过这样的压缩使得最终表示的长度字符个数尽可能小并输出这个最小长度。例如abababab可以压缩为(ab)4长度为555括号两个字符子串ab两个字符数字4一个字符相比原长度888节省了333个字符。输入格式第一行包含一个整数TTT1≤T≤1001 \le T \le 1001≤T≤100表示测试用例数。接下来TTT行每行一个字符串SSS长度满足5≤∣S∣≤1005 \le |S| \le 1005≤∣S∣≤100。输出格式对于每个测试用例输出一行一个整数表示SSS经过一级压缩后可达到的最小长度。样例输入2 abcda dabbababbabadddddccccbbbbbbbbbbbb输出5 23第二个样例中最优压缩为d(abba)2ba(d)5cccc(b)12其长度为11412214122231 1 4 1 2 2 1 4 1 2 2 231141221412223具体长度计算见说明。题目分析本题的核心是给定一个长度不超过100100100的字符串允许将其划分为若干段每段要么保持原样要么表示成(X)k的形式XXX为一段子串kkk为重复次数且k≥2k \ge 2k≥2。压缩不能嵌套所以每个压缩块是独立的块之间直接拼接。由于∣S∣|S|∣S∣很小我们可以用动态规划DP\texttt{DP}DP解决。设dp[i]\textit{dp}[i]dp[i]表示前缀S[0…i−1]S[0 \ldots i-1]S[0…i−1]压缩后的最短长度。转移时考虑最后一个块若最后一个块为原样字符则dp[i]dp[i−1]1\textit{dp}[i] \textit{dp}[i-1] 1dp[i]dp[i−1]1若最后一个块是一个压缩块即S[j…i−1]S[j \ldots i-1]S[j…i−1]可以表示为(X)k(X)k(X)k则dp[i]min⁡(dp[i],dp[j]cost(j,i))\textit{dp}[i] \min(\textit{dp}[i], \textit{dp}[j] \text{cost}(j, i))dp[i]min(dp[i],dp[j]cost(j,i))其中cost(j,i)\text{cost}(j, i)cost(j,i)为将该子串压缩后的长度。问题转化为对于任意子串S[j…i−1]S[j \ldots i-1]S[j…i−1]判断它是否可以表示为某个字符串XXX重复kkk次k≥2k \ge 2k≥2并计算压缩后的长度。如果能则其压缩长度为2∣X∣digits(k)2 |X| \text{digits}(k)2∣X∣digits(k)括号两个字符XXX的长度以及kkk的十进制位数。注意若子串长度小于444即p⋅k≤3p \cdot k \le 3p⋅k≤3压缩不可能更短因为2∣X∣digits(k)≥21142 |X| \text{digits}(k) \ge 2 1 1 42∣X∣digits(k)≥2114而原长最多为333所以这样的压缩没有意义但我们的算法仍可处理实际上不会优。由于∣S∣≤100|S| \le 100∣S∣≤100我们可以直接枚举所有可能的周期ppp即XXX的长度和重复次数kkk计算每个子串的最小压缩代价然后进行DP\texttt{DP}DP。解题思路预处理所有子串的最小压缩代价定义一个二维数组cost[j][i]\textit{cost}[j][i]cost[j][i]表示子串S[j…i−1]S[j \ldots i-1]S[j…i−1]压缩后的最短长度。若该子串不能被压缩即不存在ppp使得它是某个字符串重复kkk次且k≥2k \ge 2k≥2则cost[j][i]∞\textit{cost}[j][i] \inftycost[j][i]∞。枚举过程枚举起点jjj0≤jn0 \le j n0≤jn。枚举周期ppp1≤p≤(n−j)/21 \le p \le (n-j)/21≤p≤(n−j)/2因为至少需要两个周期才能压缩。从jjj开始检查字符串是否以S[j…jp−1]S[j \ldots jp-1]S[j…jp−1]为周期连续重复。我们可以用一个循环记录当前能够匹配到的最远位置maxLen即满足S[jt]S[j(t mod p)]S[jt] S[j (t \bmod p)]S[jt]S[j(tmodp)]的最大ttt。对于每个可能的重复次数kkk2≤k2 \le k2≤k且p⋅k≤maxLenp \cdot k \le \textit{maxLen}p⋅k≤maxLen子串S[j…jp⋅k−1]S[j \ldots j p \cdot k - 1]S[j…jp⋅k−1]可以压缩为(X)k(X)k(X)k其中XS[j…jp−1]X S[j \ldots jp-1]XS[j…jp−1]压缩后的长度为2pdigits(k)2 p \text{digits}(k)2pdigits(k)。更新cost[j][jp⋅k]min⁡(cost[j][jp⋅k],2pdigits(k))\textit{cost}[j][j p \cdot k] \min(\textit{cost}[j][j p \cdot k], 2 p \text{digits}(k))cost[j][jp⋅k]min(cost[j][jp⋅k],2pdigits(k))。注意这里我们仅使用一级压缩即压缩后的块不能再包含压缩因此我们不需要考虑嵌套。每个压缩块独立其内部是原字符串的子串不涉及其他压缩。这正是预处理时直接计算原始子串重复次数的原因。动态规划转移定义dp[i]\textit{dp}[i]dp[i]为前缀S[0…i−1]S[0 \ldots i-1]S[0…i−1]压缩后的最小长度。初始化dp[0]0\textit{dp}[0] 0dp[0]0。对于iii从111到nnn先令dp[i]dp[i−1]1\textit{dp}[i] \textit{dp}[i-1] 1dp[i]dp[i−1]1第i−1i-1i−1个字符单独保留。然后对于所有jij iji如果cost[j][i]≠∞\textit{cost}[j][i] \ne \inftycost[j][i]∞则尝试转移dp[i]min⁡(dp[i],dp[j]cost[j][i])\textit{dp}[i] \min(\textit{dp}[i], \textit{dp}[j] \textit{cost}[j][i])dp[i]min(dp[i],dp[j]cost[j][i])。最终答案即为dp[n]\textit{dp}[n]dp[n]。正确性说明预处理枚举了所有可能的周期和重复次数因此任何可压缩的子串都会被考虑到并记录其最优压缩长度。DP\texttt{DP}DP的过程考虑了所有可能的分割方式包括不压缩任何部分的平凡分割因此能够找到全局最优解。由于压缩不能嵌套我们的分割是平坦的即每个块要么是单个字符要么是(X)k块之间无嵌套这完全符合题意。复杂度分析设n∣S∣n |S|n∣S∣n≤100n \le 100n≤100。预处理阶段枚举jjjO(n)O(n)O(n)枚举pppO(n)O(n)O(n)对于每个j,pj, pj,p计算maxLen最多扫描O(n)O(n)O(n)长度再枚举kkk总复杂度为O(n3)O(n^3)O(n3)即10610^6106数量级完全可以接受。DP\texttt{DP}DP阶段O(n2)O(n^2)O(n2)。空间复杂度O(n2)O(n^2)O(n2)存储cost\textit{cost}cost。由于T≤100T \le 100T≤100总运算量约为100×106100 \times 10^6100×106在 C 中完全可行。代码实现// Lets call SPaDe a SPaDe// UVa ID: 12451// Verdict: Accepted// Submission Date: 2026-07-12// UVa Run Time: 0.010s//// 版权所有C2026邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;// 计算整数 x 的十进制位数 (x 2)intdigitCount(intx){intcnt0;while(x0){cnt;x/10;}returncnt;}intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intT;cinT;while(T--){string S;cinS;intn(int)S.size();constintINF1e9;// cost[j][i] 表示子串 S[j..i-1] 整体压缩后的最短长度若不可压缩则为 INFvectorvectorintcost(n,vectorint(n1,INF));// 枚举起点 j 和周期 p计算所有可压缩的块for(intj0;jn;j){// p 至少为 1且需要至少两个周期所以 p (n-j)/2for(intp1;p(n-j)/2;p){// 计算从 j 开始能连续匹配模式 S[j..jp-1] 的最大长度 maxLenintmaxLen0;while(jmaxLennS[jmaxLen]S[jmaxLen%p]){maxLen;}// 枚举重复次数 k (k 2)for(intk2;p*kmaxLen;k){intlenp*k;intcurCost2pdigitCount(k);// 括号2个 子串长度 数字位数if(curCostcost[j][jlen]){cost[j][jlen]curCost;}}}}// 动态规划dp[i] 表示前缀 S[0..i-1] 的最短压缩长度vectorintdp(n1,INF);dp[0]0;for(inti1;in;i){// 不压缩当前字符直接拼接dp[i]dp[i-1]1;// 尝试以 i 结尾的压缩块起点 jfor(intj0;ji;j){if(cost[j][i]!INF){dp[i]min(dp[i],dp[j]cost[j][i]);}}}coutdp[n]\n;}return0;}总结本题是一道典型的区间DP\texttt{DP}DP与字符串周期检测问题。由于数据范围很小∣S∣≤100|S| \le 100∣S∣≤100直接枚举所有子串及其周期并计算压缩代价即可无需复杂数据结构。关键点与技巧周期检测利用取模运算验证字符串是否为某模式的重复时间复杂度O(n3)O(n^3)O(n3)在本题限制下可行。压缩长度计算注意数字kkk的位数以及括号占用的两个字符。动态规划将原问题分解为前缀的最优解通过枚举最后一个块完成转移这种分割方式天然避免了嵌套问题。细节处理初始化cost\textit{cost}cost为无穷大表示不可压缩dp[0]0\textit{dp}[0] 0dp[0]0保证前缀为空时的正确性。本题虽然简单但综合运用了周期枚举、动态规划和字符串处理是练习基础DP\texttt{DP}DP和贪心思维的好题。
延伸阅读

更多相关文章

2026/9/10 8:05:20

WPS会员调整引争议:办公软件收费模式探讨

1. 事件背景与用户争议焦点2023年12月20日,金山办公旗下WPS因会员体系调整引发大规模用户投诉。根据黑猫投诉平台数据显示,当月相关投诉量激增287%,主要矛盾集中在三个方面:一是原有免费功能被划入付费会员体系;二是连…

2026/9/7 20:25:22

WANDR基准:重新定义AI智能体搜索与验证能力的评估标准

当AI智能体告诉你"根据我的搜索,这个问题的答案是..."时,你真的能相信它吗?在智能体日益普及的今天,我们面临着一个尴尬的现实:大多数智能体在信息检索环节存在严重短板,要么搜索范围有限&#x…

2026/9/10 13:59:41

MSPM0 LFSS低功耗子系统:RTC、IWDT与安全模块实战解析

1. 低功耗子系统(LFSS)在嵌入式设计中的核心价值在电池供电的物联网设备、智能仪表、可穿戴设备等对功耗极其敏感的应用场景中,如何让设备在“休眠”时依然保持关键功能,并在需要时精准唤醒,是嵌入式工程师面临的核心挑…

2026/9/12 11:05:30

CYW240128与FPGA协同调试实战:SPI通信、DMA驱动与信号完整性

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 11:05:30

交易规则构建与执行:从行为约束到稳定盈利

1. 交易规则的本质与价值十年前我刚踏入交易市场时,和大多数新手一样沉迷于寻找"圣杯指标"。直到连续爆仓三次后,我才真正理解华尔街那句老话:"市场会变,人性永不变"。EagleTrader交易室墙上挂着的那句"…

2026/9/12 11:05:30

大语言模型(LLM)技术解析与实践指南

1. 大语言模型入门指南:从零基础到技术实践 作为一名长期关注AI技术发展的从业者,我见证了大型语言模型(LLM)从学术研究到产业应用的完整历程。这篇文章将系统性地介绍LLM的核心概念、技术原理和实践方法,帮助不同基础的读者建立完整的知识框…

2026/9/12 11:00:29

榆林本地营销策划公司怎么选?一套可落地的筛选框架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/12 10:09:03

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码