zoukankan      html  css  js  c++  java
  • 困难的串 Kryptn Factor Uva129

    题目描述

    输入格式

    输出格式 

    【输入样例】

    7 3
    30 3
    0 0

    【输出样例】

    ABAC ABA
    7
    ABAC ABCA CBAB CABA CABC ACBA CABA
    28

    题意

    将一个包含两个相邻的重复子串的子串,称为“容易的串”,其他为“困难的串”。 输入正整数n和l,输出由前l个字符组成的,字典序第k小的困难的串。

    基本框架不难确定:从左往右依次考虑每个位置上的字符。因此,问题的关键在于如何判断当前字符串是否已经存在连续 的重复子串。

    例如,判断ABACABA

    • 检查所有长度为偶数的子串,分别判断每个子串的前一半是否等于后一半。
    • 判断前串的后缀。
    #include <stdio.h>
    #include <string.h>
    int S[50], L, n, cnt;
    int dfs(int cur)
    {
        if (n == cnt++)
        {
            for (int i = 0; i < cur; i++)
                printf("%c", 'A' + S[i]); // 将整型转换为字符输出
            printf("
    ");
            return 0;
        }
        for (int i = 0; i < L; i++)
        {
            S[cur] = i;
            int ok = 1;
            for (int j = 1; j * 2 <= cur + 1; j++) // 将cur分半
            {
                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 (!dfs(cur + 1))
                    return 0; // 如果找到解,则直接退出,找到解时,return 0,且ok=1
        }
        return 1;
    }
    int main()
    {
        while (~scanf("%d %d", &n, &L))
        {
            // 置0,以免影响下组数据
            cnt = 0;
            memset(S, 0, sizeof(S));
            dfs(0);
        }
        return 0;
    }
    转载请注明出处:https://www.cnblogs.com/stu-jyj3621
  • 相关阅读:
    jquery弹出窗口
    js定时器
    jquery树形菜单
    用convert转换参数对比
    jquery常用例子!
    JS总结
    上传简历实现只浏览不下载的效果
    区块链入门(1):搭建(Ubuntu系统)Truffle v3.2.1 开发和测试环境
    URL Routing组件是如何与ASP.NET MVC框架组合起来的
    接单网站收集
  • 原文地址:https://www.cnblogs.com/stu-jyj3621/p/13444203.html
Copyright © 2011-2022 走看看