题目:
如果一个字符串包含两个相邻的重复子串,则称他们是“容易的串”,其他串称为“困难的串”。例如,BB ABCDABCD AABCCCBC都是容易的,而 A ABC ABCA都是困难的。
输入正整数k和L,输出由前L个字符组成的、字典序第k小的困难的串。输入保证答案不超过80个字符。
样例输入
7 3
样例输出
ABACABA
代码如下
#include <iostream>
using namespace std;
int cnt = 0;
int k,L;
int s[80];
int dfs(int cur)
{
if( cnt == k )
{
for (int i = 0; i <cur; i ++)
cout << char('A'+s[i]);
cout << endl;
return 0;
}
else cnt ++;
for (int i = 0; i < L; i ++)
{
s[cur] = i;
int ok = 1;
for (int j = 1; j*2 <=cur+1; j ++ )
{
int equal = 1;
for (int p = 0; p < j; p ++ )
if ( s[cur-p] != s[cur-p-j] )
{ equal = 0; break; }
if (equal) {ok = 0; break;}
}
if (ok) if (!dfs(cur+1)) return 0;
}
return 1;
}
int main()
{
memset(s,0,sizeof(s)/sizeof(int));
cin >> k >> L;
dfs(0);
}