UVa 12451 Let‘s call SPaDe a SPaDe

发布时间:2026/11/11 1:28:41

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/11/11 1:28:41

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

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

2026/11/11 1:28:41

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

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

2026/11/6 11:05:47

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

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

2026/11/11 1:27:31

手机上可以审电工证嘛?真实经历告诉你报名流程和避坑指南

手机上可以审电工证嘛?真实经历告诉你报名流程和避坑指南 你是不是也遇到过这样的情况:刚找到工作,单位说必须要有电工证才能上岗,可你连报名流程都不清楚,手忙脚乱地到处打听“手机上可以审电工证嘛”?这种“火烧眉毛”的感觉,我见过太多人了,我自己…

2026/11/11 1:27:31

低压电工作业是啥全流程办理指南 全国通用怎么考最稳妥

低压电工作业是啥全流程办理指南 全国通用怎么考最稳妥 怕考不过白交培训费?低压电工作业证是电工类最基础也是最实用的证书之一,全国通用,不管是找工作还是在工地干活,它都是刚需。很多人第一次报考,担心钱花了却拿不到证,其实只要掌握流程和备考方法…

2026/11/11 1:27:31

什么专业电工证加分 电工证过期怎么复审电子证书

什么专业电工证加分 电工证过期怎么复审电子证书 证书过期了不知道怎么复审延期,很多人遇到这个问题后才意识到,电工证不是一劳永逸的,特别是在特种作业行业,像低压电工、高压电工这些证书,不仅关系到个人职业发展,还直接影响岗位资格与安全生产。现在…

2026/11/11 1:27:31

_电工证考试多久拿证报名入口与办理流程

电工证考试多久拿证值不值得考 去哪报名不被坑全讲透 不知道去哪报名怕被中介坑?别急,这篇文章带你搞清楚【_电工证考试多久拿证】这件事,从报名到拿证全流程解析,还有 值不值得考 的干货,全是过来人经验。…

2026/11/11 1:27:31

海东市电工证网上查询实操考试心里没底怕挂科?这份攻略帮你稳过

海东市电工证网上查询实操考试心里没底怕挂科?这份攻略帮你稳过 实操考试心里没底怕挂科?你不是一个人。在海东市电工证报考大军中,像你一样担心操作不过关的考生不在少数。很多人考前没怎么练过,一上手就手忙脚乱,最后结果只能是补考甚至重报。别急,下…

2026/11/11 1:22:31

公司为什么要我电工证 怎么报名流程全解析

公司为什么要我电工证 怎么报名流程全解析 学历不高怕报不上名?其实电工证报考门槛没你想象中高,今天就用南阳卧龙区一位应届工程类毕业生的案例,带你搞懂【公司为什么要我电工证】背后的真相,还有 怎么报名 的全流程干货。…

2026/11/10 8:12:38

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/11 0:02:26

考低压电工证通过率考试真题与备考技巧

低压电工证通过率高不高?学历不高也能考,值不值得考? 你是不是总听说电工证能帮你找高薪工作,但又担心自己学历不够,考不上?其实,低压电工证考试门槛并没有你想象中那么高,关键是方法对不对。这篇文章就告诉你, 考低压电工证通过率到底有多高 ,…

2026/11/11 0:02:26

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名 你是不是也和我一样,刚毕业就听说低压电工证学时必须达标才能上岗?可一打听,发现报名机构五花八门,价格参差不齐, 不知道去哪报名怕被中介坑…

2026/11/10 20:08:15

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

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

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

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