题意 : 如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的 串”。例如,BB、ABCDACABCAB、ABCDABCD都是容易的串,而D、DC、ABDAB、 CBABCBA都是困难的串。程序从输入中读取多行数据,每行包括两个整数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

分析 : 考虑使用深搜暴力一个个构造出合法的困难串,在深搜时按字典序考虑构造序列的每一位即可。但是有个难点,就是如何判断是否有重复?紫书给出了很好的解释=》一种方法是检查所有长度为偶数的子串,分别判断每个字串的前一半是否等于后 一半。尽管是正确的,但这个方法做了很多无用功。还记得八皇后问题中是怎么判断合法性 的吗?判断当前皇后是否和前面的皇后冲突,但并不判断以前的皇后是否相互冲突——那些 皇后在以前已经判断过了。同样的道理,我们只需要判断当前串的后缀,而非所有子串。换句话说就是在每判断一个位置的时候,我们只要枚举并检查含有新添加字母的偶数串合法后缀(也就是串的长度不要超过总长),就像书上说的,因为是一个个字母递增添加构造的,所以每一个都有和前面的进行判断,故只考虑当前而不考虑之前。

#include<bits/stdc++.h>
using namespace std;
int k, L;
char * letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int ans;
bool check(char *temp, int last)
{
    ; *j<=last+; j++){//->learn
        bool Equal = true;
        ; k<j; k++){
            +k] != temp[last-*j++k]) {Equal = false;break;}
            //if(temp[last-k] != temp[last-k-j]) {Equal = false;break;}//也可以
        }
        if(Equal) return false;
    }
    return true;
}
;
inline void DFS(int num, char *temp)
{
    ) return ;
    if(cnt==k) { temp[num]='\0';ans=strlen(temp);return ; }
    ; i<L; i++){
        ) return ;
        temp[num] = letter[i];
        if(check(temp, num)){
            cnt++;
            DFS(num+, temp);
        }
    }
}
int main(void)
{
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
    while(~scanf("%d %d", &k, &L) && (k&&L)){
        ans = -, cnt = ;
        ];
        DFS(, temp);
        ;
        ;
        ; i<ans; i++){
             && i %  == )
                printf("\n");
             && i %  == )
                printf(" ");
            printf("%c", temp[i]);
        }
        printf("\n%d\n", ans);
    }
    ;
}

瞎想 : 在考虑八皇后或此类深搜回溯进行构造的时候,如果需要有一些结合前面判断状态是否可行,那就多想想是否只考虑构成当前状态的新因素和已构造出的东西就可以判断状态是否可行,因为此类一个个递增构造的,每构造一个状态出来就要判别一次,当前状态的判别就不用理会之前的状态了,因为在做重复工作。

UVa 129 Krypton Factor (DFS && 回溯)的更多相关文章

  1. UVa 129 Krypton Factor【回溯】

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

  2. UVA.129 Krypton Factor (搜索+暴力)

    UVA.129 Krypton Factor (搜索+暴力) 题意分析 搜索的策略是:优先找长串,若长串不合法,则回溯,继续找到合法串,直到找到所求合法串的编号,输出即可. 注意的地方就是合法串的判断 ...

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

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

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

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

  5. Uva 129 Krypton Factor

    0.这道题的输出 处理起来挺麻烦的 以后类似的可以借鉴一下 ;i<cur;i++) { && i%==) printf("\n%c",a[i]); & ...

  6. uva 129 krypton factors ——yhx

     Krypton Factor  You have been employed by the organisers of a Super Krypton Factor Contest in which ...

  7. 129 - Krypton Factor

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

  8. UVA-129 Krypton Factor(回溯)

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

  9. hdu - 1627 Krypton Factor (dfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1627 给定 n 和 L 找出第n个范围在0-L之内的字符串,字符串要求没有相邻的子串是相同的. 按照格式输出. ...

随机推荐

  1. 【神经网络与深度学习】【Qt开发】【VS开发】从caffe-windows-visual studio2013到Qt5.7使用caffemodel进行分类的移植过程

    [神经网络与深度学习][CUDA开发][VS开发]Caffe+VS2013+CUDA7.5+cuDNN配置成功后的第一次训练过程记录<二> 标签:[神经网络与深度学习] [CUDA开发] ...

  2. 【VS开发】解决位图缩放失真

    当用以下函数加载一张位图时,当窗口发生重绘更改大小时,位图将失真: CBitmap bitmap;  bitmap.LoadBitmap(IDB_BITMAP2);  BITMAP bmp;  bit ...

  3. 【VS开发】在VS2010中开发ActiveX控件设置测试容器的方式

    在VS2010中开发ActiveX控件设置测试容器的方式 借鉴文章http://blog.csdn.net/waxgourd0/article/details/7374669 在VS2010中开发MF ...

  4. sqlplus语句示例

    我们通常所说的DML.DDL.DCL语句都是sql*plus语句,它们执行完后,都可以保存在一个被称为sql buffer的内存区域中,并且只能保存一条最近执行的sql语句,我们可以对保存在sql b ...

  5. python 安装 colorama 控制台输出彩色文字

    pip install colorama from colorama import Back,Fore,Style # 字体颜色print(Fore.LIGHTBLUE_EX,'HelloWorLd' ...

  6. input搜索框实时检索功能实现(超简单,核心原理请看思路即可)

    问题:实现input搜索框实时检索的功能,类似哔哩哔哩首页搜索功能(壮哉我大b站!).公司要求,emmmm没办法,果然懒人是要被赶着走才会进步的说,诶嘿O(∩_∩)O. 解决方法: 1.参考资料:ht ...

  7. 使用QtXlsx来读写excel文件

    概述:QtXlsx是功能非常强大和使用非常方便的操作excel类库.包括对excel数据读写.excel数据格式设置及在excel里面根据数据生成各种图表. 下面重点介绍如何安装和使用QtXlsx. ...

  8. Hadoop基础概念

    Apache Hadoop有2个核心的组件,他们分别是: HDFS: HDFS是一个分布式文件系统集群,它可以将大的文件分裂成块并将他们冗余地分布在多个节点上,HDFS是运行在用户空间的文件系统 Ma ...

  9. 七、for循环

    for循环

  10. 剑指offer-4:变态条楼梯

    ##四.变态条楼梯 ###题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. ###分析 也是斐波那契数列问题,根据上述的思路,可 ...