如果一个字符串包含俩个相邻的重复子串,则称它是“容易的串”,其他串称为"困难的串“,输入正整数N和L,输出
由前L个字符组成的,字典序第k小的困难的串。
我们只需要判断当前串的后缀,而非所有的子串是否满足条件即可.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cctype>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<ctime>
#include<algorithm>
#include<climits>
#define LL long long
using namespace std;
const int maxn=101;
int S[maxn];
int L,N;
int cnt;
int dfs(int cur)
{
if(cnt++==N)
{
for(int i=0;i<cur;i++)
printf("%c",S[i]+'A');
cout<<endl;
return 0;
}
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 k=0;k<j;k++)
if(S[cur-k]!=S[cur-k-j])
{
equal=0;
break;
}
if(equal) {ok=0;break;}
}
if(ok) if(!dfs(cur+1)) return 0;
}
return 1;
}
int main()
{
while(cin>>N)
{
cin>>L;
cnt=0;
dfs(0);
}
}