7_5 困难的串(UVa129)<回溯法:避免无用判断>

“超级氪因素大赛”(译注:英国的一档电视心智竞答节目)的主办方雇你来对付那些足智多谋的参赛选手。在比赛的一个环节中,节目主持人将念出一长串的字母来考验选手的记忆能力。因为许多选手都是分析字串模式的高手,为了增加一些比赛的难度,主办方决定不再使用那些含有特定重复子串的字串。但是他们又不能将所有重复的子串都删掉,如果那样的话字串中就不存在两个相同的单字了,这反倒会让问题变的非常简单。为了解决这一问题,他们决定仅删除那些包含相邻重复子串的字串。我们将存在上述相邻重复情况的字串称为“easy”(简单),否则称为“hard”(难)。

比方说,字串ABACBCBAD就是一个“easy”,因为它里面有相邻的重复子串“CB”。另举一些“easy”字串的例子如下:

  • BB
  • ABCDACABCAB
  • ABCDABCD 

    下面是一个“hard”字串的例子:

    • D
    • DC
    • ABDAB
    • CBABCBA

    Input and Output

    为了能给节目主持人提供无限量的问题字串,要求你来写一个程序执行生成运算。程序从输入中读取多行数据,每行包括两个整数n和L(即按此顺序给出),其中n > 0,L的范围是1 ≤ L ≤ 26。根据这些输入,程序要按照字母表升序打印出第n个“hard”字串(由字母表中的前L个字母构成),并在接下来的一行打印这个串的长度。按照上述规则,第一个串应该是“A”。对于给定的n和L,你可以认为第n个“hard”串是一定存在的。

    比方说,当L = 3时,头7个“hard”字串为:

    A
    AB
    ABA
    ABAC
    ABACA
    ABACAB
    ABACABA

    字串可能很长,因此要将它们分成4个字为一组,中间用空格隔开。如果超过16组,则换一行,再接着输出第17组。

    按照此格式,对于输入的整数7和3,输出应该为:

    ABAC ABA
    7

    输入由一行两个零表示结束。你的程序可以限定最大的字串长度为80。

    Sample Input
    输入示例

    30 3
    0 0

     

    Sample Output
    输出示例

    ABAC ABCA CBAB CABA CABC ACBA CABA
    28

原文地址:https://www.cnblogs.com/jjzzx/p/5576039.html