原题:https://uva.onlinejudge.org/external/1/129.pdf

按照字典顺序生成第n个“困难的串”

“困难的串”指的是形如ABAB, ABCABC, CDFGZEFGZE的串,它们都有相邻的重复子字符串

字母的范围是L,既 'A'到'A' + L


分析: 大体上这是一道生成排列组合的题。难点在于我们如何判断当前生成的串是"困难的串"

我们首先采用递归按照字典顺序从小到大生成串, 那么每一次我们处理的都是前一个"困难的串",

既满足没有相邻重复子串。那么我们如何高效的判断给它新追加的字母会不会使它不满足"困难的串"的条件?


判断方法:

如果最后一个字母等于倒数第二个字母,那么不是困难的串,返回false

再从右往左找第一个和末尾字母相同的字母,因为它有可能是相邻重复串的末尾

然后以找到的字母为中心点,判断左右两边串是不是相等,相等就返回false

重复以上步骤

所以算法时间复杂度是O(n^2)

由于n <= 80

所以完全够用

 #include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = + ;
int sol[MAXN], L, n, cnt, depth;
bool stop; bool check(int index, int chr) {
if (index > ) {
if (chr == sol[index - ]) return false;
int i = index - ;
while (i >= ) {
while(i >= && sol[i] != chr) i--;
if (i >= && sol[i] == chr && i * + >= index) {
bool same = ;
for (int j = index - ; j > i; j--)
if (sol[j] != sol[j - index + i]) same = ;
if (same) return false;
}
i--;
}
}
return true;
} void next_str(int dep) {
if (cnt == n) {
stop = ;
for (int i = ; i < dep; i++) {
if (i && i % == ) putchar('\n');
else if (i && i % == ) putchar(' ');
printf("%c", char(sol[i] + 'A'));
}
depth = dep;
putchar('\n');
return;
}
for (int i = ; i < L; i++) {
if (stop) return;
if (check(dep, i)) {
sol[dep] = i;
cnt++;
next_str(dep + );
}
}
} int main() {
while (scanf("%d%d", &n, &L) == && n) {
stop = ; cnt = depth = ;
next_str();
printf("%d\n", depth);
}
return ;
}

Krypton Factor 困难的串-Uva 129(回溯)的更多相关文章

  1. UVA129 Krypton Factor 困难的串 dfs回溯【DFS】

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

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

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

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

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

  4. UVa 129 (回溯法) Krypton Factor

    回溯法确实不是很好理解掌握的,学习紫书的代码细细体会. #include <cstdio> ]; int n, L, cnt; int dfs(int cur) { if(cnt++ == ...

  5. UVa 129 Krypton Factor【回溯】

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

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

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

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

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

  8. Uva 129 Krypton Factor

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

  9. uva129 - Krypton Factor 7.4.3 困难的串

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

随机推荐

  1. Quartz.NET配置(Log4net)

    最近有个任务关于服务调度,想起以前看过Quartz.NET调度任务非常棒. 今天小试Quartz.NET,前面配置Quartz.NET很轻松,控制台也输出了.但是想配合Log4net来做日志文件,怎么 ...

  2. WCF存储图片到指定文件夹下

    string path = System.IO.Directory.GetCurrentDirectory() + @"\POIImages\"; Guid imgid = Gui ...

  3. 分享整理的sql脚本

    1. 表空间使用率 SQL> select  a.tablespace_name,  2          round(a.total_size) "total_size M" ...

  4. PV、UV、IP的区别

    网站推广需要一个网站访问统计工具,常用的统计工具有百度统计.51la.量子恒道统计等.网站访问量常用的指标为PV.UV.IP.那么什么是PV.UV和IP,PV.UV.IP的区别是什么? --首先来看看 ...

  5. OpenCart本地调试环境搭建

    OpenCart简介: 免费开源网络版电子商务系统,是建立在线商务网站首选之一.有众多用户和开发基础,结合其丰富特性与模板插件,可最大化定制在线商店.(也就是用来方便开网店的) 本地调试准备: Fir ...

  6. 找出整数中第k大的数

    一  问题描述: 找出 m 个整数中第 k(0<k<m+1)大的整数. 二  举例: 假设有 12 个整数:data[1, 4, -1, -4, 9, 8, 0, 3, -8, 11, 2 ...

  7. jQuery慢慢啃之事件(七)

    1.ready(fn)//当DOM载入就绪可以查询及操纵时绑定一个要执行的函数. $(document).ready(function(){ // 在这里写你的代码...}); 使用 $(docume ...

  8. form WebBrowser自动点击弹出提示框alert、弹出对话框confirm、屏蔽弹出框、屏蔽弹出脚本错误的解决办法

    针对WebBrowser控件中自动点击弹出框及禁用脚本提示问题得到如下几种实际情况的解决办法,绝对管用. 1.屏蔽弹出错误脚本 将WebBrowser控件ScriptErrorsSuppressed设 ...

  9. R语言数据分析

    CSDN博客:包括R语言基础.R语言数据挖掘.hadoop大数据及spark等 http://blog.csdn.net/qq_16365849 R语言及数据分析 http://blog.csdn.n ...

  10. DOS命令行使用pscp实现远程文件和文件夹传输(转)

    转自 http://snailwarrior.blog.51cto.com/680306/141201   pscp是putty安装包所带的远程文件传输工具,使用和Linux下scp命令相似,具体的使 ...