困难的串

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

 1 #include<iostream>

 2 using namespace std;

 3 int a[100];

 4 int count=0;            

 5 int n,L;                                                                        //如果在main函数中生命,则dfs参数需要修改,否则无法识别n和L

 6 //void dfs(int a[], int cur, int L, int n)

 7 void dfs(int cur)

 8 {

 9     if(cur==n)

10     {

11         for(int i=0; i<cur; i++)

12             cout<<char('A'+a[i])<<" ";

13         cout<<endl;

14         count++;

15         return ;                                                                //如注释该句,则运行会报错。

16     }

17     for(int i=0; i<L; i++)

18     {

19         a[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(a[cur-k]!=a[cur-k-j])

26                 {

27                     equal=0;

28                     break;

29                 }

30             if(equal)

31             {

32                 ok=0;

33                 break;

34             }

35         }

36         if(ok)    dfs(cur+1);

37         //    dfs(a,cur+1, L, n);

38     }

39 }

40 void main()

41 {

42     memset(a,-1,100);

43     //    int n,L;

44     cin>>n>>L;

45     dfs(0);

46     //dfs(a, 0, L, n);

47     cout<<count<<endl;

48 }

 

你可能感兴趣的:(困难的串)