• [搜索]UVa 129 困难的串


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

    输入样例:

    7 3
    30 3
    0 0

    输出样例

    ABAC ABA
    7
    ABAC ABCA CBAB CABA CABC ACBA CABA
    28

    UVa的输入输出很烦。

    1、每行最后无空格

    2、每四个字母为一组,每组中间有一个空格,每十六组一行,第十七组在第二行输出(注意第一行最后不能有空格)

     

    思路:搜索,判断后缀(因为前面的部分已经判断过)。

    直接看代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<string>
    #include<algorithm>
    using namespace std;
    
    int cnt,n,l;
    char a[1000];
    int dfs(int cur){
        if(cnt++ == n){
            for(int i = 0; i < cur; i++){
                printf("%c",a[i]);    
                if(i + 1 == 64&&i + 1!= cur)
                    printf("
    ");
                else 
                    if((i + 1)%4 == 0&&i + 1!= cur)printf(" ");
                
            }
            printf("
    %d
    ",cur );
            return 0;//返回0代表已经找到第n大的困难的串
        }
        for(int i = 0; i < l; i++){//
            a[cur] =  i + 'A';
            int ok = 1;     
            for(int j = 1; j*2 <= cur + 1; j++){//j是后缀长度
                int is_same = 1;
                for(int k = 0; k < j; k++){
                    if(a[cur - k] != a[cur - j - k]){//依次比较各个字母
                        is_same = 0;
                        break;
                    }
                }
                if(is_same){
                    ok = 0;
                    break;
                  }
            }
            if(ok)if(!dfs(cur + 1))return 0;
        }
        return 1;
    }
    
    int main(){
        while((cin >> n >> l)&&(n|l)){//特判n==0的情况
            cnt = 0;
            dfs(0);
        }
        return 0;
    }
  • 相关阅读:
    点云处理算法核心-八叉树
    点云平台之cloudCompare开发三
    点云法向量估计方法
    PCL源码编译
    PCL裁剪之多边形裁剪
    点云平台PCLvisualization多边形裁剪方法初探
    点云合并pcl重载“+”
    点云平台之CloudCompare开发二
    点云平台之QtitanRibbon
    神舟电脑 战神ZX6-CT5A2 键盘失灵
  • 原文地址:https://www.cnblogs.com/FoxC/p/10629851.html
Copyright © 2020-2023  润新知