Krypton Factor 困难的串-Uva 129(回溯)
原题: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(回溯)的更多相关文章
- UVA129 Krypton Factor 困难的串 dfs回溯【DFS】
		
 Krypton Factor Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
 - UVa 129 Krypton Factor困难的串 (dfs  递归搜索)
		
回溯法,只需要判断当前串的后缀,而不是所有的子串 #include<iostream> #include<cstdio> using namespace std; ]; int ...
 - UVA - 129 Krypton Factor (困难的串)(回溯法)
		
题意:求由字母表前L个字母组成的字典序第n小的困难串.(如果一个字符串包含两个相邻的重复子串,则称它是"容易的串",其他串称为"困难的串".) 分析:回溯时,检 ...
 - UVa 129 (回溯法) Krypton Factor
		
回溯法确实不是很好理解掌握的,学习紫书的代码细细体会. #include <cstdio> ]; int n, L, cnt; int dfs(int cur) { if(cnt++ == ...
 - UVa 129 Krypton Factor【回溯】
		
学习的紫书的回溯,理解起来还是好困难的说啊= = #include<iostream> #include<cstdio> #include<cstring> #in ...
 - UVa 129 Krypton Factor (DFS && 回溯)
		
题意 : 如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的 串”.例如,BB.ABCDACABCAB.ABCDABCD都是容易的串,而D.DC.ABDAB. CBABCB ...
 - UVA.129 Krypton Factor (搜索+暴力)
		
UVA.129 Krypton Factor (搜索+暴力) 题意分析 搜索的策略是:优先找长串,若长串不合法,则回溯,继续找到合法串,直到找到所求合法串的编号,输出即可. 注意的地方就是合法串的判断 ...
 - Uva 129 Krypton Factor
		
0.这道题的输出 处理起来挺麻烦的 以后类似的可以借鉴一下 ;i<cur;i++) { && i%==) printf("\n%c",a[i]); & ...
 - uva129 - Krypton Factor  7.4.3 困难的串
		
7.4.3困难的串 学习点:dfs加入返回值,递归搜索过程中如果有一个成功,就直接退出 //7.4.3 困难的串 #include<cstdio> #include<cstrin ...
 
随机推荐
- 设置ORACLE环境变量
			
sqlplus 执行不了可能原因是未设置环境变量,设置方法: export ORACLE_HOME=/usr/local/instantclient_11_2
 - EF 更新数据出现 System.Data.Entity.Infrastructure.DbUpdateConcurrencyException: 异常
			
EF6更新 数据出现 System.Data.Entity.Infrastructure.DbUpdateConcurrencyException: Store update, insert, or ...
 - SQLite 入门教程(四)增删改查,有讲究
			
增删改查操作,其中增删改操作被称为数据操作语言 DML,相对来说简单一点. 查操作相对来说复杂一点,涉及到很多子句,所以这篇先讲增删改操作,以例子为主,后面再讲查操作. 一.插入数据 INSERT I ...
 - undefined与null的区别(待修整)
			
没有实体的对象称为空对象.只用对象的引用,而不存在引用的实体对象 就叫做空对象 在常见的强类型语言中,通常有一个表示"空"的值,比如NULL.但是在Javascript中,空(或者 ...
 - javascript——事件处理
			
<script type="text/javascript"> function EventUtil() { var _self = this; ///添加事件 var ...
 - ARM架构下linux设备树加载的方法
			
引入设备树后bootloader加载DTB方法: 1. 标准方法 将linux kernel放到内存地址为<kernel img addr>的内存中. 将DTB放到地址为<dtb a ...
 - 在easyui dialog的子页面内如何关闭弹窗
			
因项目需要在dialog中添加滚动条,所以就在div中加了iframe: <div id="applyRefundDialog" style="display:no ...
 - JDK和JRE的区别?
			
很多朋友可能跟我一样,已经使用JAVA开发很久了,可是对JDK,JRE,JVM这三者的联系与区别,一直都是模模糊糊的. 今天特写此文,来整理下三者的关系. JDK : Java Development ...
 - 如何自定义RecycleView item的间距
			
引言 在以前使用ListView和GridView时,设置item之间的间距还是相对比较简单的,因为它们的基本属性里面Android已经定义好了,可以直接设置属性值即可.但Google为了通用性和灵活 ...
 - Java JPA 查询实体部分字段
			
前言 相信大家在用Java JPA作为ORM的时候都会有这种困惑,就是某个表T我仅仅希望取到其中的A.B.C三个字段,可是jpa是通过Entity Class映射的方式组合查询结果的. 那么如何通过使 ...