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); } }
相关文章推荐
- 发布 asp.net网站 到本地IIS
- 通用命名前缀
- fprintf fputs 函数学习
- Toast,Dialog,PopupWindow,Notification
- Java虚拟机学习(一)
- 兼容Android API 2.X的涟漪点击效果
- 语言区域代码
- 常用数据库链接字符串
- 搭建内部YUM源
- POJ 1679 The Unique MST
- hash 表达式树 UVa 12219 Common Subexpression Elimination
- Linux时区信息和修改
- NOI 2007 社交网络 (COGS 15) Floyd求最短路及方案数
- [JNI] Java 调用 C++ dll
- 使用Eclipse的Working Set管理项目
- Poj 2774 Long Long Message (后缀数组)
- XML Schema
- linux入门教程(九) 文本编辑工具vim
- 用VB实现COM+组件配置
- 【白书之路】1225 - Digit Counting 数字统计