题目描述
如果一个字符串中存在相邻的重复子串,则称为容易的串,反之称为困难的串。输入正整数n和L,输出由前L个大写字母组成的,字典序第n小的困难的串。L不大于5,n不大于20。
输入
在一行输入n和L的值,遇到文件末尾结束。
输出
在一行输出字典序第n小的困难的串。
样例输入
7 3
样例输出
ABACABA
#include <iostream>
using namespace std;
int n, L, S[20] = { 0 }, cnt = 0;
int dfs(int now) {
if (cnt++ == n) {
for (int i = 0; i < n; ++i)
cout << char('A' + S[i]);
cout << endl;
return 0;
}
for (int i = 0; i < L; ++i) {
S[now] = i;
int flag = 1;
for (int j = 1; j * 2 <= now + 1; ++j) {
int equal = 1;
for (int k = 0; k < j; ++k)
if (S[now - k] != S[now - k - j]) {
equal = 0;
break;
}
if (equal) {
flag = 0;
break;
}
}
if (flag)
if (!dfs(now + 1))
return 0;
}
return 1;
}
int main() {
cin >> n >> L;
dfs(0);
return 0;
}