HDU4850 构造一个长度为n的串,要求任意长度为4的子串不相同

n《=50W。(使用26个字母)

构造方法:26个,最多构造出26^4种不同的串,长度最长是26^4+3,大于是输出“impossble”,用四维数组判重。每次向前构造一位(先从上一位字符后一个开始),这样,可以构造出26^4-25种,打印出来发现(bbbb~zzzz),构造不出来,于是,学习了他人方法,把这些放在最前面,再重复上述方法构造即可(以后都可以用这种向前推一法构造)。

PS:从中额外学得:若用string 的s=s+char,拼接,速度很慢,用char s[],然后s[size++]=char,快得多。输出有点意思,直接输出n个即可,末地址起。

#include<iostream>  //46MS
#include<string>
#include<cstdio>
using namespace std;
int mark[26][26][26][26];
char s[480000];
int size=0;
int main()
{
    int n;
     for(int i=0;i<26;i++)
    {
                s[size++]=char(i+'a');
                s[size++]=char(i+'a');
                s[size++]=char(i+'a');
                s[size++]=char(i+'a');
    }
    for(int i=0;i<size-3;i++)
        mark[s[i]-'a'][s[i+1]-'a'][s[i+2]-'a'][s[i+3]-'a']=1;
    int t1=25,t2=25,t3=25;
            for(int i=104;i<=456979;i++)
            {
                int count1=0;
                for(int j=t3+1;count1<2;j++)
                {
                     if(j==26)
                    {
                        j=0;
                        count1++;
                    }
                    if(mark[t1][t2][t3][j]==0)
                    {
                        mark[t1][t2][t3][j]=1;
                        char temp=j+'a';
                        s[size++]=temp;
                        t1=t2;t2=t3;t3=j;
                        break;
                    }
                }
            }
    /*   for(int i=0;i<26;i++)
         for(int j=0;j<26;j++)
           for(int k=0;k<26;k++)
             for(int t=0;t<26;t++)
               if(mark[i][j][k][t]==0)
                  printf("%d%d%d%d\n",i,j,k,t);*/
    while(cin>>n)
    {
        if(n>26*26*26*26+3)
        {
            cout<<"Impossible"<<endl;
            continue;
        }
        else
        {
              printf("%s\n",s+456979-n);//输出n个字符!后面的是起始地址!
        }
    }
    return 0;
}

HDU4850 构造一个长度为n的串,要求任意长度为4的子串不相同

时间: 2024-07-30 16:38:45

HDU4850 构造一个长度为n的串,要求任意长度为4的子串不相同的相关文章

JavaScript算法----给定一个长度为N的串,求最长回文子串。

/* *给定一个长度为N的串,求最长回文子串. */ function returnStr(str){ console.log(str); var arr = [],s = ""; for(var i=0;i<str.length;i++){ s = ""; if(str.charAt(i)==str.charAt(i+1)){ var j=0; while(str.charAt(i+j+1)==str.charAt(i-j)){ s = str.charAt

Petrozavodsk Winter-2013. Ural FU Contest Problem D. Five Palindromes manacher、一个串切割成5个回文子串、优化

Ural Federal University Contest, SKB Kontur Cup Petrozavodsk Winter Training Camp, Saturday, February 2, 2013 Problem D. Five Palindromes Input file: input.txt Output file: output.txt Time limit: 2 seconds (3 seconds for Java) Memory limit: 256 mebib

构造一个加法机

二进制加法 任何一个二进制数都是由一个以上的比特组成,是一个比特串.为了突出组成它的每个比特,一个二进制数可以表示成(如果它包含了6比特的话): 在这里,a0...a5都是单个的比特,是这个二进制数的每一位.所以,如果a5a4a3a2a1a0=110101,那么它们的对应关系就如图所示. 如果两个二进制数相加时,先把它们右对齐,叠在一起: 因为最先相加的是最右边那一列,即a0和b0,所以这里没有从其他列来进位,属于单纯的两个比特相加.不考虑其他列的进位时,两个比特相加有4种可能,如下图: 倒数第

linux内核分析 第三周 构造一个简单的Linux系统MenuOS

一.计算机的三个法宝 存储程序计算机,函数调用堆栈,中断二.操作系统的两把剑:1.中断上下文的切换,保存现场和恢复现场2.进程上下文的切换. 三.linux内核源代码的分析: ·arch/目录保存支持多种CPU类型的源代码,重点是x86·init目录:含有main.c,内核启动相关的代码基本都在init目录下·ipc目录:进程间的通信·kernel目录:有Linux内核的核心代码.四.构造一个简单的Linux系统 使用实验楼的虚拟机打开shell 1.cd LinuxKernel/2.qemu

作业3:构造一个简单的Linux系统MenuOS 20135115臧文君

构造一个简单的Linux系统MenuOS 注:作者:臧文君,原创作品转载请注明出处,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码介绍 1.根目录 arch/x86目录下的代码是我们重点关注的,arch中包括支持不同CPU的源代码. init目录下包含内核启动相关的代码,如main.c(start_kernel函数相当于普通C程序的main函数,是Linux内核初始化的起点). ipc

Linux内核设计第三周——构造一个简单的Linux系统

Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核源代码分析 arch/目录保存支持多种CPU类型的源代码 其中的关键目录包括:Documentation.drivers.firewall.fs(文件系统).include init目录:含有main.c,内核启动相关的代码基本都在init目录下 start_kernal()函数为启动函数,初始化内

构造一个随机发生器

http://m.blog.csdn.net/blog/u012605629/40406577 构造一个随机发生器 2014-10-23阅读83 评论0 2.已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,使得它构造0和1的概率均为 1/2:构造一个发生器,使得它构造1.2.3 的概率均为 1/3: ...,构造一个发生器,使得它构造 1.2.3....n 的概率均为1/n,要求复杂度最低. /* 2.已知一随机发生器,产生0的概率是p,产生1的概率是1-p,

20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 进程上下文的切换 第一讲  Linux内核源代码介绍 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录.PC机一般都基于此目录. init目录包含核心的初始化代码(不是系统的引导代

《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS

构造一个简单的Linux系统MenuOS 一.linux内核源代码简介 三大法宝(存储程序计算机.函数调用堆栈.中断)和两把宝剑(中断上下文的切换:保存现场和恢复现场.进程上下文的切换) 1.在linux内核源码里面arch占有的代码量相当庞大.arch/x86目录下的代码是我们重点关注的. 2.内核启动相关的代码基本都在init目录下(main.c). start_kernel是初始化linux内核的起点. start_kernel相当于c程序中的main函数 3.linux内核的核心代码在k