news 2026/10/26 17:23:21

UVa 129 Krypton Factor

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 129 Krypton Factor

题目分析

本题要求生成“困难序列”,定义如下:
一个序列中如果存在两个相邻且相同的子串,则该序列为“简单序列”,否则为“困难序列”。
题目要求按字典序生成第nnn个困难序列,序列中的字符取自字母表前LLL个大写字母(1≤L≤261 \leq L \leq 261≤L≤26)。
输入以两个000结束。
输出时,序列每444个字符一组,组间用空格隔开;若组数超过161616,则从第171717组开始换行。
序列长度不超过808080。

例如,当L=3L = 3L=3时,前777个困难序列为:

A AB ABA ABAC ABACA ABACAB ABACABA

解题思路

1. 核心问题:如何判断“困难序列”?

题目要求序列中不能包含两个相邻且相同的子串。
例如:ABACBCBAD中CB相邻重复出现,因此是简单序列。
我们需要一个高效的判断函数,对于任意序列,判断其是否合法。

一种直接的判断方法是:
设当前序列为sss,检查所有可能的子串长度jjj(从111到⌊∣s∣2⌋\lfloor \frac{|s|}{2} \rfloor⌊2∣s∣​⌋),
对于每个起始位置iii,比较s[i:i+j]s[i:i+j]s[i:i+j]与s[i+j:i+2j]s[i+j:i+2j]s[i+j:i+2j]是否相同。
如果存在相同,则说明有相邻重复子串,序列不合法。

2. 生成字典序第nnn个困难序列

由于序列长度有限(最大808080),且字母表大小LLL不超过262626,
我们可以使用**回溯法(DFS\texttt{DFS}DFS)**按字典序生成序列。

具体步骤:

  1. 从空串开始,每次尝试在当前串末尾添加一个字母(从字母表前LLL个字母中选择)。
  2. 每次添加后,调用判断函数检查新串是否合法(即是否为困难序列)。
  3. 如果合法,则继续向下递归;否则尝试下一个字母。
  4. 每次找到一个合法序列时,计数器加一。当计数器等于nnn时,输出当前序列并结束搜索。

剪枝优化:

  • 当当前串不合法时,直接回溯,不继续扩展。
  • 每次尝试添加字母时,可以跳过那些显然会导致重复的字母(例如上一个字母相同的字母可以直接跳过,因为相邻相同字符会导致非法)。

3. 输出格式要求

  • 序列每444个字符一组,组间用空格隔开。
  • 如果组数超过161616组(即长度超过646464个字符),则从第656565个字符开始换行。
  • 输出序列后,在下一行输出序列长度。

4. 算法复杂度

  • 判断函数时间复杂度为O(∣s∣3)O(|s|^3)O(∣s∣3),但∣s∣≤80|s| \leq 80∣s∣≤80,可以接受。
  • 回溯搜索最坏情况下会尝试所有组合,但实际由于剪枝,效率较高。
  • 题目保证nnn不会超过可生成的困难序列总数,因此搜索不会无限进行。

代码实现

// Krypton Factor// UVa ID: 129// Verdict: Accepted// Submission Date: 2015-12-01// UVa Run Time: 0.000s//// 版权所有(C)2015,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;boolisValid(string line){if(line.length()==1)returntrue;for(intj=1;j<=line.length()/2;j++)for(inti=0;i<line.length()-j;i++)if(line.substr(i,j)==line.substr(i+j,j))returnfalse;returntrue;}voiddisplay(string line){boolnewLinePrinted=false;for(inti=1;i<=line.length();i++){cout<<line[i-1];if(i%64==0){cout<<endl;newLinePrinted=true;}elseif(i%4==0&&i<line.length()){cout<<" ";newLinePrinted=false;}}if(newLinePrinted==false)cout<<endl;cout<<line.length()<<endl;}voidlexicographical(intn,intL){string alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ";string line="A";intcounter=1,start=0;while(counter<n){boolfound=false;for(inti=start;i<L;i++){if(alpha[i]==line[line.length()-1])continue;elseif(isValid(line+alpha[i])){found=true;start=0;counter++;line+=alpha[i];break;}}if(found==false){start=line[line.length()-1]-'A'+1;line.erase(line.length()-1,1);}}display(line);}intmain(intac,char*av[]){intn,L;while(cin>>n>>L,n||L)lexicographical(n,L);return0;}

总结

本题是一道经典的“困难序列”生成问题,通过回溯法和剪枝可以有效求解。关键点在于理解“相邻重复子串”的判断,以及如何按字典序生成序列。输出格式需要注意分组和换行的规则,避免格式错误导致无法通过。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/24 6:58:46

海尔智能家居集成完整配置指南

海尔智能家居集成完整配置指南 【免费下载链接】haier 项目地址: https://gitcode.com/gh_mirrors/ha/haier 海尔Haier智能家居集成是HomeAssistant中功能最全面的海尔设备连接解决方案&#xff0c;能够将您家中的所有海尔智家设备无缝接入智能家居系统。这个强大的集成…

作者头像 李华
网站建设 2026/10/25 4:14:37

高并发场景应对:OCR服务负载均衡配置方案

高并发场景应对&#xff1a;OCR服务负载均衡配置方案 &#x1f4d6; 项目简介与技术背景 随着数字化进程的加速&#xff0c;OCR&#xff08;光学字符识别&#xff09; 技术在发票识别、文档电子化、智能客服等场景中扮演着越来越关键的角色。尤其是在企业级应用中&#xff0c;单…

作者头像 李华
网站建设 2026/10/22 15:48:24

新手必备:5分钟学会用gifski制作高清GIF动画的完整教程

新手必备&#xff1a;5分钟学会用gifski制作高清GIF动画的完整教程 【免费下载链接】gifski GIF encoder based on libimagequant (pngquant). Squeezes maximum possible quality from the awful GIF format. 项目地址: https://gitcode.com/gh_mirrors/gif/gifski 还在…

作者头像 李华
网站建设 2026/10/23 14:17:41

告别混乱:脚本窗口管理效率提升300%的方案

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 实现一个高效的窗口管理器类&#xff0c;具有以下功能&#xff1a;1. 使用WeakMap自动跟踪所有打开的窗口 2. 提供按条件过滤关闭窗口的能力&#xff08;如只关闭特定域名窗口&…

作者头像 李华
网站建设 2026/10/24 12:15:22

零基础教程:5分钟学会CAD批量打印插件安装使用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 设计一个极简版的CAD批量打印插件&#xff0c;要求&#xff1a;1.三步完成安装&#xff08;下载-运行-重启CAD&#xff09;&#xff1b;2.直观的拖放式操作界面&#xff1b;3.内置…

作者头像 李华
网站建设 2026/10/23 0:32:08

好写作AI:你的“原创发动机”,查重率低于5%是如何实现的?

还在用“同义词替换”对抗查重算法&#xff1f;真正的高手&#xff0c;在起跑线上就已经赢了。深夜的电脑前&#xff0c;你瞪着屏幕上27%的查重报告&#xff0c;双眼发红。你已经用尽了毕生语文功力&#xff1a;主动改被动、长句拆短句、专业词换“大白话”……可那些该死的红色…

作者头像 李华