Krypton Factor

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 392    Accepted Submission(s): 174

Problem Description
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

Input

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 that contain integers n and L (in that order), where n > 0 and L is in the range , and for each input line prints out the nth 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. 

For example, with L = 3, the first 7 hard sequences are: 


AB 
ABA 
ABAC 
ABACA 
ABACAB 
ABACABA 
As each 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. 

Therefore, if the integers 7 and 3 appear on an input line, the output lines produced should be 

ABAC ABA
7
Input is terminated by a line containing two zeroes. Your program may assume a maximum sequence length of 80.

Sample Input


30 30 0

Sample Output


ABAC ABCA CBAB CABA CABC ACBA CABA28

Source


问题简介:

 输入正整数n和L,输出由前L个字符组成的、字典顺序第n小的不含相邻重复字串的字符串。不含相邻重复字串的字符串是指,一个字符串中,任意两个相邻的字串都不相等。输出结果时,对于找到的字符串,每4个字符间加入一个空格,每行输出80个字符。

思路分析:

大致的框架就是每次增加一个字符,在增加字符的同时去判断加上这个字符后是否产生了连续的相同子串,这也是很关键的一个点,如何判断是否产生了连续的相同子串,由于采用了回溯的思想,故以前的串是没有连续的相同子串的,故只需从后向前看包含了新字母后有无连续的相同子串。我们可以外层循环去遍历两个子串的长度,从1-(cur+1)/2(即当前串的一半),内层循环去遍历每一对子串的对应的点,如果在内层循环找到了一个点在两个子串上的对应位置不相等,则在此长度下没有产生连续的相同子串。于是,外层循环的长度加1,去判断下一个子串是否相同。如果找到了某一对连续的相同子串,则此次的分配不合理,尝试在该点分配下一个小于L的字母,如果没有找到一对连续的相同子串,则此次分配合理,可以递归下一个点,并且记录困难子串的变量加一。当变量等于n的时候则输出该序列即可。 由于无需返回值,所以直接return 即可。

package lianxi;

import java.util.Scanner;

public class KryptonFactorUva129 {
static Scanner scan = new Scanner(System.in);
static int C[]=new int [10000];
static int n,l,count=0;
public static void main(String[] args) {
while(scan.hasNext()){
n = scan.nextInt();
l = scan.nextInt();
getFactor(0);
for(int i=0;i<C.length;i++){
C[i] = 0;
}
}
}
private static int getFactor(int cur) { if(count++ == n){
for(int i = 0;i<cur;i++){
System.out.print((char)(C[i]+'A'));
}
System.out.println(); return 0;
} for(int i=0;i<l;i++){
C[cur] = i;
int ok = 1;
for(int j = 1;j*2<=cur+1;j++){
int equal = 1;
for(int k = 0;k < j;k++){
if(C[cur - k] != C[cur-k-j] ){
equal = 0; //找到一个不相同的点本次的测试子段即为困难的串
break;
}
}
if(equal == 1){
ok = 0;
break; //存在了相同的连续子串,尝试下一个字母
}
}
if(ok==1){
if(getFactor(cur+1) == 0){
return 0;
}
} }
return 1; } }


UVA129 Krypton Factor 困难的串 dfs回溯【DFS】的更多相关文章

  1. Krypton Factor 困难的串-Uva 129(回溯)

    原题:https://uva.onlinejudge.org/external/1/129.pdf 按照字典顺序生成第n个“困难的串” “困难的串”指的是形如ABAB, ABCABC, CDFGZEF ...

  2. UVa 129 Krypton Factor困难的串 (dfs 递归搜索)

    回溯法,只需要判断当前串的后缀,而不是所有的子串 #include<iostream> #include<cstdio> using namespace std; ]; int ...

  3. uva129 - Krypton Factor 7.4.3 困难的串

      7.4.3困难的串 学习点:dfs加入返回值,递归搜索过程中如果有一个成功,就直接退出 //7.4.3 困难的串 #include<cstdio> #include<cstrin ...

  4. UVA129 —— Krypton Factor (氪因素)

    Input and Output In order to provide the Quiz Master with a potentially unlimited source of question ...

  5. 129 - Krypton Factor

    /*UVa129 - Krypton Factor --回溯问题.看例子可知道确定该字符串是按照从左到右依次考虑每个位置,当前位置填不上所有的字符时,需要回溯. -- */ #define _CRT_ ...

  6. UVA - 129 Krypton Factor (困难的串)(回溯法)

    题意:求由字母表前L个字母组成的字典序第n小的困难串.(如果一个字符串包含两个相邻的重复子串,则称它是"容易的串",其他串称为"困难的串".) 分析:回溯时,检 ...

  7. UVa 129 Krypton Factor (DFS && 回溯)

    题意 : 如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的 串”.例如,BB.ABCDACABCAB.ABCDABCD都是容易的串,而D.DC.ABDAB. CBABCB ...

  8. UVa 129 Krypton Factor【回溯】

    学习的紫书的回溯,理解起来还是好困难的说啊= = #include<iostream> #include<cstdio> #include<cstring> #in ...

  9. UVA-129 Krypton Factor(回溯)

    题目大意:由字母A到Z组成的字符串,其中有两个子串完全相同的叫做容易的串,反之叫困难的串.找出由前L个字母组成的第n个困难的串. 题目分析:简单回溯,不过要判断是否存在重复子串比较棘手.<入门经 ...

随机推荐

  1. Swift iOS实现把PCM语音转成MP3格式

    最近折腾了swift的语音录制识别和转码,这块还是比较坑的,由于语音识别的准确度实测大概也就80%左右,所以还是需要上传录音文件啊.首先是用讯飞语音SDK实现语音录制和识别(语音听写),第一个坑是讯飞 ...

  2. linux学习--2.文件管理的基本命令

    文件的基本操作 前言: 看完这篇图文我应该能保证读者在Linux系统下对文件的操作能跟用Windows环境下一样流畅吧,好了下面正文 正文: 基础知识: linux里共有以下几类文件,分别为目录(di ...

  3. 查看网卡信息 - ethtool

    查看网卡是千兆还是万兆网卡,使用ethtool 网络接口名 ethtool eth0

  4. in和exists比较

    in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询. 一直以来认为exists 比in 效率高的说法是不准确的.如果查询的两个表大小相当, ...

  5. Day 1 模拟

    1. P1088 火星人 利用STL中的next_permutation();函数求一种排列的下一种排列,循环m次即为答案.(STL大法好~~C++是世界上最好的语言~~逃 #include < ...

  6. 微信小程序学习 动手撸一个校园网小程序

    动手撸一个校园网微信小程序 高考完毕,想必广大学子和家长们都在忙着查询各所高校的信息,刚好上手微信小程序,当练手也当为自己的学校做点宣传,便当即撸了一个校园网微信小程序. 效果预览 源码地址:Gith ...

  7. 内网渗透之权限维持 - MSF

    年初九 天公生 0x034 MSF(美少妇) 启动msf msfconsole 先启动msf依赖的postgresql数据库 初始化数据库 msfdb init (要用普通用户) msf路径 /usr ...

  8. MySQL数据备份之逻辑备份工具mysqldump

    #前言:我们知道对数据进行备份很重要,出现非正常操作可以进行对数据进行恢复,下面我们就来使用一下mysql数据库自带的一个逻辑备份工具mysqldump 1.简单概述 #mysqldump:mysql ...

  9. linux下 GUI 数码相册项目 持续更新中

    GITHUB: https://github.com/nejidev/digital_photo_album 本项目,是部分参考别人的项目,是全新从0编写的.算法实现和别人肯定是不同的,github ...

  10. 基于osg的python三维程序开发(三)------几何形体及纹理

    def createScene(): geode = osg.Geode() pointsGeom = osg.Geometry() vertices = osg.Vec3Array() vertic ...