uva 129(困难的串)

来源:互联网 发布:骚气的诗词 知乎 编辑:程序博客网 时间:2024/05/01 00:04

题目大意:如果一个字符串包含两个相邻的重复子串,则称它是"容易的串", 其他串称为"困难的串"; 列如, 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);    }}


0 0
原创粉丝点击