题意 : 如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的 串”。例如,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. CF486B OR in Matrix(构造+思维)

    CF486B 一道有趣的思维题 由于or的性质可知只要a[i][j]为1那么b中第i行,第j列将都变成1 相反的,如果b[i][j]是0那么a中第i行,第j列都必须是0 根据第二个性质我们可以构造出a ...

  2. CentOS 上面 恢复 Oracle 数据库实例的简单操作流程

    1. 当获取了数据库的备份可以进行 oracle数据库的备份恢复操作 linux上面要复杂一些. 这里面简单描述一下. 2. 远程连接 linux 主要工具可以选择 xshell 如图示: 3. 建议 ...

  3. Windown Server 2008配置tomcat9虚拟路径

    一.用途 用于保存项目运产生的文件 二.步骤 1.修改conf\下的web.xml <!-- 找到listings将false改为true -->        <init-para ...

  4. Java设计给小学生的自动出题系统

    系统要求: 1.自动出题,涉及加减乘除四则运算 2.运算为两位数之间 3.减法不能出现负数 4.乘法结果不超过100 5.除法必须整除 6.用户决定出题量 7.用户决定几道题一换行 8.题目不允许重复 ...

  5. Luogu P3647 [APIO2014]连珠线

    题目 换根dp. 显然对于给定的一棵有根树,蓝线都不能拐弯. 设\(f_{u,0}\)表示\(u\)不是蓝线中点时子树内的答案,\(f_{u,1}\)表示\(u\)是蓝线中点时子树内的答案.(以\(1 ...

  6. P5596 洛谷月赛 题 题解

    因为a>=0,b>=0,所以y^2-x^2>=0,所以y>x,因为都是自然数设y=x+k,化简得x=b-k^2/2*k-a;可知x仅当b-k^2%2*k-a==0且b-k^2与 ...

  7. 實現QQ第三方登錄

    <?php // 写几个函数,分别用于获取code,token,openid,用户信息 // 跳转到QQ授权登录页面 function code(){ $response_type='code' ...

  8. Python数据基础类型-列表

    1,列表的创建 list1 = ['hello', 'world', 1997, 2000] list2 = [1, 2, 3, 4, 5 ] list3 = ["a", &quo ...

  9. Python_2day

    选择 布尔类型.数值和表达式 注意:比较运算符的相等是两个等号,一个等到代表赋值 在Python中可以用整型0来代表False,其他数字来代表True 后面还会讲到 is 在判断语句中的用发 In [ ...

  10. mysql数据库基础命令(一)

    用户与权限 创建用户 mysql>create user test identified by 'BaC321@#'; 修改密码 ##5.5版本及以前的命令 mysql>set passw ...