回溯法,只需要判断当前串的后缀,而不是所有的子串
#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; }