回溯法,只需要判斷當前串的後綴,而不是所有的子串
#include<iostream>
#include<cstdio>
using namespace std;
int s[1000];
int n,l,cnt;
int bfs(int cur)
{
if(cnt++==n)
{
for(int i=0; i<cur; i++)
printf("%c",'A'+s[i]);
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(!bfs(cur+1))
return 0;
}
return 1;
}
int main()
{
while(cin>>n>>l&&n&&l)
{
cnt=0;
bfs(0);
}
return 0;
}