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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

dfs,结束时需要return结束递归!判断重复子串只需判断后缀!
  • GuoZLH
  • GuoZLH
  • 2017年02月06日 01:47
  • 199

UVA-129 Krypton Factor(dfs)

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

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...
  • kun768
  • kun768
  • 2014年12月15日 21:54
  • 317

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...
  • a27038
  • a27038
  • 2017年07月18日 16:06
  • 75

uva 129 Krypton Factor

回溯法应用,注意dfs递归退出的条件应该放在什么位置,注意最后输出数据的格式。 #include int m, n; unsigned char arr[2000]; int count; ...

UVa 129:Krypton Factor(回溯)

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=841&page=show_pr...

UVa 129 Krypton Factor (回溯好题)

129 - Krypton Factor Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=onlinejud...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVa 129 Krypton Factor
举报原因:
原因补充:

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