您的位置:首页 > 其它

uva 129(困难的串)

2015-09-04 17:22 337 查看
题目大意:如果一个字符串包含两个相邻的重复子串,则称它是"容易的串", 其他串称为"困难的串"; 列如, BB, ABCDACABCAB, ABCDABCD都是容易的串,而D, DC, ABDAB都是困难的串; 输入正整数n和L, 输出由前L个字符组成的, 字典序第n小的困难的串;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int n, L, cnt, ans;
int a[85];

int dfs(int cur){
if(cnt++ == n){
ans = cur;
for(int i = 0; i < cur; ++i){
printf("%c", a[i]+'A');
if((i+1) % 4 == 0 && (i+1) % 64 != 0 && i != cur-1)
printf(" ");
else if((i+1) % 64 == 0)
printf("\n");
}
return 0;
} else{
for(int i = 0; i < L; ++i){
a[cur] = i;
int ok = 1;
for(int j = 1; j*2 <= cur+1; ++j){     //尝试长度为j*2的后缀;
int _equal = 1;
for(int k = 0; k < j; ++k){      //检查后一半是否等于前一半
if(a[cur-k] != a[cur-k-j]){_equal = 0; break;}
}
if(_equal == 1){      //后一半等于前一半,方案不合法;
ok = 0; break;
}
}
if(ok){
if(!dfs(cur+1)) return 0;
}
}
}
return 1;
}

int main()
{
while(scanf("%d%d", &n, &L) != EOF && (n || L)){
cnt = 0;
dfs(0);
if(cnt % 64 != 0)
printf("\n");
printf("%d\n", ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: