UVa 129 Krypton Factor

原创 2016年06月01日 03:16:28


来源:《算法竞赛入门经典(第2版)》例题7-5、UVa 129
题目描述:
给定n、L,求用字典序前L个大写字母构造出的无相邻重复字串的串中,字典序第n小的那个。所谓无相邻重复字串,是指任意i<=j,都有s[i..j] != s[j + 1..2j - i + 1]。
题目分析:
这种按顺序来的(有拓扑序)的题目深搜是很好的,这个题几乎不怎么回溯,严谨的分析暂时还做不来,不知道具体复杂度怎么样。
这道题具体的做法是按字典序顺次枚举当前位置可能的字母,然后往后搜一位,呃,没什么绕的。至于怎么判断枚举的字母是否合法,注意到加入当前字母前是合法的,故只要判断加入当前字母后会不会造成对某k,s[k+1..d] = s[2k - d + 1..k]。

//  Created by wander on 16/6/1.
//  Copyright © 2016年 W4anD0eR96. All rights reserved.
//  UVa129 Krypton Factor
//  类型:搜索-回溯法

#include "bits/stdc++.h"
using namespace std;

int n, L, cnt, ans[105];

bool Dfs(int d) { // d代表递归深度,这里表示当前串长度为d
  if (cnt >= n) {
    for (int i = 0; i < d; i += 1) { // 注意到i表示当前已打印了i个字符
      if (i != 0 && i % 64 == 0) putchar('\n');
      else if (i != 0 && i % 4 == 0) putchar(' ');
      putchar('A' + ans[i]);
    }
    printf("\n%d\n", d);
    return true;
  }
  cnt += 1;
  for (int i = 0; i < L; i += 1) {
    ans[d] = i;
    // 检查是否合法
    bool check = true;
    for (int j = 1; j + j <= d + 1; j += 1) {
      bool eq = true;
      for (int k = 0; k < j; k += 1)
        if (ans[d - k] != ans[d - k - j]) { eq = false; break; }
      if (eq) { check = false; break; }
    }
    if (check && Dfs(d + 1)) return true; // 注意短路特性
  }
  return false;
}

int main() {
#ifdef DEBUG
  freopen("in", "r", stdin);
  freopen("out", "w", stdout);
#endif
  while (~scanf("%d%d", &n, &L) && n + L) { cnt = 0; Dfs(0); }
  return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

UVA - 129 Krypton Factor

题目:You have been employed by the organisers of a Super Krypton Factor Contest in which contestants h...

Uva129 Krypton Factor【dfs回溯】【例题7-5】

dfs,结束时需要return结束递归!判断重复子串只需判断后缀!

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

UVA-129 Krypton Factor(dfs)

题目链接: UVA-129 Krypton Factor(dfs) 题目大意: 如果一个字符串包含两个相邻的重复子串,则成它是"容易的串",其他串成为"困难的串"例如: BB ,ABCDACA...

Krypton Factor UVA - 129

题目:如果一个字符串包含两个相邻的重复子串,则称它为“容易的串”,否则称为“困难的串”.输入n,L,找出用A~A+‘L’字符所生成第n个困难的串,并按格式输出 分析:这道题上来就不会,直接看了题解,...

UVa - 129 - Krypton Factor

基本思路就是一个字母一个字母的生成,只是每次生成一个需要判定是否满足要求。一种想法就是每增加一个,就判断左右的偶数长度的子串是否满足要求,这样做了很多重复工作。所以每次判定的时候只需要判断后缀偶数长度...

UVA-129 Krypton Factor 困难的串

题目链接:https://vjudge.net/problem/UVA-129 题意:如果两个字符串包含两个连续的串,则称它为“容易的串”,否则称为“困难的串”,例如,BB,ABCDABCD,ABCD...

UVA - 129 Krypton Factor

Krypton Factor  You have been employed by the organisers of a Super Krypton Factor Cont...

UVA-129 Krypton Factor

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

UVA - 129 Krypton Factor : 回溯

题目点此跳转You have been employed by the organisers of a Super Krypton Factor Contest in which contestant...

uva 129 Krypton Factor

回溯法应用,注意dfs递归退出的条件应该放在什么位置,注意最后输出数据的格式。 #include int m, n; unsigned char arr[2000]; int count; ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)