UVA129 困难的串 Krypton Factor

简介: UVA129 困难的串 Krypton Factor

题目描述

将一个包含两个相邻的重复子串的子串,称为“容易的串”,其他为“困难的串”。 输入正整数n和l,输出由前l个字符组成的,字典序第k小的困难的串。


输入样例

7 3
30 3
0 0

输出样例

7 3
ABAC ABA
7
30 3
ABAC ABCA CBAB CABA CABC ACBA CABA
28
0 0


思路解析: 这个题是求字符串的困难串,在进行判断时,由于困难串比较难判断,我们来判断简单串,如果判断简单串呢?我们只需要判断字符串的后缀子串即可.因为一个困难串+一个字符,相邻子串只可能出现在后面.所以我们只需要判断后缀即可.

之后采用DFS解决即可.

参考代码

#include<iostream>
using namespace std;
int n,cnt,L,S[100];
int dfs(int cur){
  //判断困难串是否达到了n
  if(cnt++==n){
    for(int i = 0; i < cur; i++){
      if(i&&i%4==0&&i!=64){
        cout<<" ";
      }else if(i==64){
        cout<<endl; 
      }
      cout<<char('A'+S[i]); 
    }
    cout<<endl;
    cout<<cur<<endl;
    return 0;//结束
  }
  for(int i = 0;i < L;i++)//依次判断cur位置可能出现的字符. 
  {
    S[cur] = i;
    int ok = 1;//困难串的标记
    for(int j = 1; j*2 <= cur+1; j++) {//判断所有的后缀 
      int equal = 1;
      for(int k = 0; k < j;k++){
        if(S[cur-k]!=S[cur-k-j]){//不相等,说明以J*2为后缀不是简单串 (但该字符串未必就是困难串,因为还有其他后缀,只有所有后缀都遍历过且都不是简单串 才成立. ) 
          equal = 0;
          break; 
        }
      } 
      if(equal){//equal:0 困难串 equal:1简单串  如果是简单串则结束该字符串,进行开始尝试下一个字符串. 
        ok = 0;
        break;
      }
    }
    if(ok){
      if(!dfs(cur+1)){//如果是困难串,则进行继续深搜.当返回后判断是否已经找够,如果找够了,则结束该层dfs. 没找够则继续往后寻找 
        return 0;
      }
    } 
  }
  return 1; 
} 
int main()
{
  while(scanf("%d %d",&n,&L)!=EOF &&n &&L){
    cnt = 0;
    dfs(0);
  }
  return 0;
}
相关文章
UVa787 - Maximum Sub-sequence Product(最大连续乘积子串)
UVa787 - Maximum Sub-sequence Product(最大连续乘积子串)
51 0
|
文件存储
Easy Number Challenge(埃式筛思想+优雅暴力)
Easy Number Challenge(埃式筛思想+优雅暴力)
89 0
|
网络架构
Codeforces Round #755 D. Guess the Permutation(交互 二分)
Codeforces Round #755 D. Guess the Permutation(交互 二分)
93 0
|
人工智能 BI
[Atcoder ARC124] XOR Matching 2-小思维 | 暴力
题意: 给出n,两个数列a[1] -> a[n],b[1] -> b[n] 问有多少个x,可以使得在我们任意一种方式排列b[]之后,有a[i] ^ b[i] == x (1 <= i <= n) 思路: 首先我们可以确定所有的答案一定在a[1] ^ b[i] (1 <= i <= n)之内,所以我们只需要将这些个x的解空间单独放到数组c[]里,然后遍历x的解空间c[],将c[i] ^ a[i]的结果记录在d[]里面,然后判断b[],d[]是否完全相同即可,如果完全相同,就可以记录答案,注意最终答案要进行去重
121 0
[Atcoder ARC124] XOR Matching 2-小思维 | 暴力
|
Java
[LeetCode]Longest Continuous Increasing Subsequence 最长连续增长序列
链接:https://leetcode.com/problems/longest-continuous-increasing-subsequence/description/难度:Easy题目:674.
1098 0