题意:
如果一个字符串包含两个相邻的重复子串,则称他为困难的串
输入k,l
输出由前l个字符组成的,字典序第k小的困难的串
搜啊搜,搜啊搜~~~
优化后的check函数:
只需要判断当前是否和前面的冲突,而不需要判断前面内部是否冲突
所以只判断后缀即可
#include<cstdio> using namespace std; int k,l,cnt; char ans[100]; bool ok; /*bool check(int num) { for(int len=1;len<=num>>1;len++) { int cnt=0; for(int s=len+1;s<=num;s++) { if(ans[s]==ans[s-len]) { cnt++; if(cnt==len) return false; } else cnt=0; } } return true; }*/ bool check(int num) { for(int len=1;len<=num<<1;len++) { int i; for(i=num;i>num-len;i--) if(ans[i]!=ans[i-len]) break; if(i==num-len) return false; } return true; } void dfs(int bit) { if(ok) return; if(cnt==k+1) { for(int i=1;i<bit;i++) { putchar(ans[i]); if(i==64&&i!=bit-1) puts(""); else if(i%4==0&&i!=bit-1) putchar(' '); } printf(" %d ",bit-1); ok=true; return; } for(int i=0;i<l;i++) { ans[bit]=i+'A'; if(check(bit)) { cnt++; dfs(bit+1); if(ok) return; } } } int main() { while(scanf("%d%d",&k,&l)) { if(!k) return 0; ok=false; cnt=1; dfs(1); } }