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

UVa129 Krypton Factor(回溯法)

题目链接

You have been employed by the organisers of a Super Krypton Factor Contest in which contestants have very high mental and physical abilities. In one section of the contest the contestants are tested on their ability to recall a sequenace of characters which has been read to them by the Quiz Master. Many of the contestants are very good at recognising patterns. Therefore, in order to add some difficulty to this test, the organisers have decided that sequences containing certain types of repeated subsequences should not be used. However, they do not wish to remove all subsequences that are repeated, since in that case no single character could be repeated. This in itself would make the problem too easy for the
contestants. Instead it is decided to eliminate all sequences containing an occurrence of two adjoining identical subsequences. Sequences containing such an occurrence will be called “easy”. Other sequences will be called “hard”. For example, the sequence ABACBCBAD is easy, since it contains an adjoining repetition of the
subsequence CB. Other examples of easy sequences are:
• BB
• ABCDACABCAB
• ABCDABCD
Some examples of hard sequences are:
• D
• DC
• ABDAB
• CBABCBA
In order to provide the Quiz Master with a potentially unlimited source of questions you are asked to write a program that will read input lines from standard input and will write to standard output.

Input
Each input line contains integers n and L (in that order), where n > 0 and L is in the range 1 ≤ L ≤ 26. Input is terminated by a line containing two zeroes.

Output
For each input line prints out the n-th hard sequence (composed of letters drawn from the first L letters in the alphabet), in increasing alphabetical order (Alphabetical ordering here corresponds to the normal ordering encountered in a dictionary), followed (on the next line) by the length of that sequence. The first sequence in this ordering is ‘A’. You may assume that for given n and L there do exist at least n hard sequences. As such a sequence is potentially very long, split it into groups of four (4) characters separated by
a space. If there are more than 16 such groups, please start a new line for the 17th group. Your program may assume a maximum sequence length of 80. For example, with L = 3, the first 7 hard sequences are:

1.题目大意:如果一个字符串包含两个相邻的重复子串,那么其称为“容易的串”,否则称为“困难的串”。现在给出一对n,L,求出包含前L个大写字母的字典序为第n个困难的串。另外在输出上要求每四个字符后面一个空格,每64个字符后面一个回车,并在字符序列的下一行打印串的长度

2.首先看题,想到了一些常规的判断重复方法,却不知道如何按字典序排列,一个令人头疼的条件。看了LRJ的讲解,才知道这无非就是dfs从0-L-1的全排列,求出之后每个位置加上’A’输出即可。然后至于如何判断是否包含相同的子串呢,我们只要判断后缀即可,假如有两个字母,显然比较第一个和第二个,如果在这基础上再添加一个,那么显然前两个就不用比较了,只比较后面两个即可

3.思想懂了,具体的代码还是有点疑惑:“for(int j=1;2*j<=cur+1;j++)”。为什么这里要cur+1呢,我觉得j<=cur/2就行。举了几个例子才看了出来:以样例一为例,假如到最后一个需要判断的字母ABACAB?,那么我们只需要比较的就只有三组:B?,CAB?,BACAB?。因为cur从0开始,而此时cur为6,故cur/2和cur+1/2相等。但是假如cur=5时,这时待判断串的长度为6,那么仍然是需要判断三个子串,所以cur需要加一

4.最后一个很奇怪的地方是,题目说保证至少有n个困难串,但事实上并非如此,第二个样例只有二十八个困难的串。我觉得应该是后面无法添加字符的话就直接返回最大的那个。因此,不能用cur和n比较,要再设置一个统计数量的变量,当其等于n时输出

#include <iostream>

using namespace std;
int n,L,cnt;
int ans[105];

int dfs(int cur){
    if(cnt++ == n){
        for(int i=0;i<cur;i++){
            if(i%64==0 && i) printf("\n");
            else if(i%4==0 && i) printf(" ");
            printf("%c",ans[i]+'A');
        }
        printf("\n%d\n",cur);
        return 0;
    }
    for(int i=0;i<L;i++){
        ans[cur]=i;
        int ok=1;
        for(int j=1;2*j<=cur+1;j++){
            int equ=1;
            for(int k=0;k<j;k++)
            if(ans[cur-k]!=ans[cur-k-j]){ equ=0; break; }
            if(equ){ ok=0; break; }
        }
        if(ok){
            if(!dfs(cur+1)) return 0;
        }
    }
    return 1;
}

int main()
{
    while(scanf("%d%d",&n,&L)!=EOF){
        if(n==0&&L==0) break;
        cnt=0;
        dfs(0);
    }
    return 0;
}

相关文章:

  • DSL是什么?
  • 蓝桥杯训练 k进制数的数位交换问题
  • 如何激发思考
  • POJ1511 Invitation Cards (最短路+正反向建图)
  • IDA*——迭代加深搜索 (UVa11212)
  • 【Android笔记】Activity涉及界面全屏的方法
  • CTU Open Contest 2019 计蒜客重现补题报告
  • 什么是Wi-Fi?
  • UVa1374 Power Calculus (IDA*)
  • Codeforces Round #624 (Div. 3) D - Three Integers(枚举技巧)
  • Android应用程序使用Google Map
  • 程序员如何提高工作效率
  • Codeforces Round #624 (Div. 3) F - Moving Points(树状数组+去重离散化)
  • Codeforces Round #624 (Div. 3) 解(补)题报告
  • chipmunk物理引擎的基本概念和基本用法
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • CentOS从零开始部署Nodejs项目
  • JavaScript学习总结——原型
  • OSS Web直传 (文件图片)
  • Python_网络编程
  • React16时代,该用什么姿势写 React ?
  • Redis 中的布隆过滤器
  • 后端_ThinkPHP5
  • 力扣(LeetCode)965
  • 区块链将重新定义世界
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 云大使推广中的常见热门问题
  • 怎么把视频里的音乐提取出来
  • Mac 上flink的安装与启动
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • #if 1...#endif
  • #includecmath
  • #每天一道面试题# 什么是MySQL的回表查询
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (02)Hive SQL编译成MapReduce任务的过程
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (补)B+树一些思想
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (汇总)os模块以及shutil模块对文件的操作
  • (算法设计与分析)第一章算法概述-习题
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • 、写入Shellcode到注册表上线
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • /etc/motd and /etc/issue
  • @font-face 用字体画图标