困难的串的求解

如果一个字符串包含两个相邻重复的子串,则称它是容易的串,如果不含这样的串就称为困难的串。例如:BB,ABCDACABCAB,ABCDABCD都是容易的串,而D,DC,ABDAB,CBABCBA都是困难的串。

输入整数n和 l,输出由前 l 个字符串组成的,字典序为第n小的困难的串,例如,当l=3时,前7个困难的串分别为:A,AB,ABA,ABAC,ABACA,ABACAB,ABACABA输入保证答案不超过80个字符。

Sample:

input:

7 3

30 3

output:

ABACABA

ABACABCACBABCABCABCACBACABA

题意也就要我么寻找第n字典序的由前l 个字母组成的困难的串。

每次都要从字母A开始遍历,这是必要的,因为这样才能保证字典序最小。

每次在前l 个字母中向字符串中添加一个字母都要回去检查是否出现了相邻的重复的串,如果没有出现就继续向下找再添加。

代码及详解如下:

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 int n,l;
 5 int s[100];
 6 bool find2;
 7 void dfs(int cur)//initial by zero
 8 {
 9     if(cur==n)//当达到第n个的时候停止
10     {
11         for(int i=0;i<cur;i++)
12         printf("%c",s[i]+‘A‘);
13         printf("\n");
14         find2=true;
15         return;
16     }
17     for(int i=0;i<l;i++)
18     {
19         s[cur]=i;
20         int ok=1;
21         for(int j=1;j*2<=cur+1;j++)
22         {
23             int equal=1;
24             for(int k=0;k<j;k++)
25             if(s[cur-k]!=s[cur-k-j]){//从最后一个字符串开始向前对比,是否出现重复
26             //例如字符串为:123456789,后面新加一个0,成为1234567890,开始对比
27             //0和9位置上地字符是否相等,然后判断90组成的子字符串和78组成的字符串
28             //是否相等,判断890和567位置上的子字符串是否相同
29             //直到判断67890和12345对比,然后终止,如果否和要求继续向下添加。
30                 equal=0;break;
31             }
32             if(equal){
33                 ok=0;
34                 break;
35             }
36         }
37         if(ok){
38             dfs(cur+1);
39             if(find2)return;
40         }
41     }
42     return;
43 }
44 int main()
45 {
46     while(cin>>n>>l)
47     {
48         memset(s,0,sizeof(s));
49         find2=false;
50         dfs(0);
51     }
52     return 0;
53 }

困难的串的求解

时间: 2024-10-02 04:03:16

困难的串的求解的相关文章

ACM题目————困难的串

题目描述 如果一个字符串包含两个相邻的重复子串,则称他是“容易的串”,其他串称为"困难的串".例如,BB,ABCDACABCAB,ABCDABCD都是容易的串,而D,DC,ABDAB,CBABCBAD都是困难的串. 输入 输入正整数n和L. 输出 输出由前L个字符串组成的,字典序第k小的困难的串.例如,当L=3时,前7个困难的串分别为A,AB,ABA,ABAC,ABACA,ABACAB,ABACABA.输入保证答案不超过80个字符. 样例输入 7 3 30 3 样例输出 ABACABA

uva129 - Krypton Factor 7.4.3 困难的串

  7.4.3困难的串 学习点:dfs加入返回值,递归搜索过程中如果有一个成功,就直接退出 //7.4.3 困难的串 #include<cstdio> #include<cstring> #include<iostream> #include<string> #include<algorithm> using namespace std; int n,L; int cnt; char v[81]; bool judge(int cur) { fo

困难的串

如果一个字符串包含两个相邻的重复字串,则称它是"容易的串",其他串称为"困难的串".例如,BB,ABCDACABCAB,ABCDABCD都是容易的,而D,DC,ABDAB,CBABCBA都是困难的.输入正整数n和L,输出由前L个字符组成的,字典序第k小的困难的串.例如,当L=3时,前7个困难的串分别为:A,AB,ABA,ABAC,ABACA,ABACAB,ABACABA.输入保证答案不超过80个字符.样例输入:7 330 3样例输出:ABACABAABACABCAC

困难的串(dfs)

困难的串 题意: 如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的串”.例如,                 BB.ABCDABCD都是容易的串,而D.DC.ABDAD.CBABCBA都是困难的串. 输入正整数n和L,输出由前L个字符组成的.字典序第k个困难的串.例如,当L=3时,前7个困难的串          分别为A.AB.ABA.ABAC.ABACA.ABACAB.ABACABA.输入保证答案不超过80个字符. 样例输入: 7  3 30 3 样例输出:

困难的串(搜索)

如果一个字符串包含包含两个相邻的重复字串,则成为容易的串,否则为困难的串,例如困难的串A,AB,ABAC,ABACA,... 输入n,L,输出由前L个字符组成的,字典序第k小的困难的串. 思路和N皇后问题类似,在判断是否存在重复字串只需判断当前串的后缀,而不是所有子串. 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int L,n,s; 5 bool flag=0; 6 char ch[1000

Krypton Factor 困难的串-Uva 129(回溯)

原题:https://uva.onlinejudge.org/external/1/129.pdf 按照字典顺序生成第n个“困难的串” “困难的串”指的是形如ABAB, ABCABC, CDFGZEFGZE的串,它们都有相邻的重复子字符串 字母的范围是L,既 'A'到'A' + L 分析: 大体上这是一道生成排列组合的题.难点在于我们如何判断当前生成的串是"困难的串" 我们首先采用递归按照字典顺序从小到大生成串, 那么每一次我们处理的都是前一个"困难的串", 既满足

【Uva 129】Krypton Factor(困难的串)

You have been employed by the organisers of a Super Krypton Factor Contest in which contestantshave very high mental and physical abilities. In one section of the contest the contestants are tested ontheir ability to recall a sequenace of characters

【DFS】困难的串

题目: 问题描述:如果一个字符串包含两个相邻的重复子串,则称它为容易的串,其他串称为困难的串.如:BB,ABCDACABCAB,ABCDABCD都是容易的,A,AB,ABA,D,DC,ABDAB,CBABCBA都是困难的. 输入正整数L,n,输出由前L个字符(大写英文字母)组成的,字典序第n小的困难的串. 例如,当L=3时,前7个困难的串分别为:A,AB,ABA,ABAC,ABACA,ABACAB,ABACABA. n 指定为4的话,输出ABAC. 代码: 1 import java.util.

7.17dfs例题:困难的串

困难的串:问题描述:如果一个字符串包含两个相邻的重复子串,则称它为容易的串,其他串称为困难的串,如:BB,ABCDACABCAB,ABCDABCD都是容易的,A,AB,ABA,D,DC,ABDAB,CBABCBA都是困难的. 输入正整数n,L,输出由前L个字符(大写英文字母)组成的,字典序第n小的困难的串.例如,当L=3时,前7个困难的串分别为:A,AB,ABA,ABAC,ABACA,ABACAB,ABACABAn指定为4的话,输出ABAC 思路:由题目得知,困难的串是字符串中包含两个相邻的重复