Problem a 困难的串问题(第五讲)

题目描述
如果一个字符串中存在相邻的重复子串,则称为容易的串,反之称为困难的串。输入正整数n和L,输出由前L个大写字母组成的,字典序第n小的困难的串。L不大于5,n不大于20。

输入
在一行输入n和L的值,遇到文件末尾结束。

输出
在一行输出字典序第n小的困难的串。

样例输入
7 3
样例输出
ABACABA

此代码用C++编译器

#include <bits/stdc++.h>
#define MAXN 100
using namespace std;

int a[MAXN], n, l, cnt=0;

int dfs(int cur)
{
    if(cnt++==n)    //**每当cnt+1必能增加一个合法字符,当cnt=n时即得到所求字符串
    {
        for(int i=0; i<n; i++)
        {
            printf("%c", a[i]+'A');
        }
        printf("\n");
        return 0;
    }
    for(int i=0; i<l; i++)
    {
        a[cur]=i;              //****尝试选中字符i+"A"
        int flag=1;
        for(int j=1; j*2<=cur+1; j++)   //***当前构建长度为2*j的字符串
        {
            int k;
            for(k=0; k<j; k++)      //***判断当前字符串是否是容易的串
            {
                if(a[cur-k]!=a[cur-k-j])
                {
                    break;        
                }
            }
            if(k==j)  //***如果k=j,即其为容易的串
            {
                flag=0;
                break;
            }
        }
        if(flag)  //***如果当前串为困难的串,并且cnt!=n,继续递归,如果cnt=n,递归结束,直接退出
        {
            if(!dfs(cur+1))
			{
               return 0;
            }
        }
    }
    return 1;
}

int main(void)
{
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin >> n >> l;
    dfs(0);
    return 0;
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值