题目描述
如果一个字符串中存在相邻的重复子串,则称为容易的串,反之称为困难的串。输入正整数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;
}