http://acm.hdu.edu.cn/showproblem.php?

pid=4850

题意:构造长度为n的字符序列。使得>=4的子串仅仅出现一次

事实上最长仅仅能构造出来26^4+4-1= 456979 的序列,大于该数的都是不可能的。构造方法。就是那种欧拉回路的序列,此题DFS会爆栈。手动扩展栈也能够AC......

递归形式的開始WA了。没有细调就换非递归了,后来又想了想,尽管自己电脑上执行不了。可是先把长度按小的来。然后调试代码,然后在扩大,AC了,当时错在MOD,递归的MOD应该是26^4。而不是26^4+1,由于控制在0~(26^4-1)范围内,就是456976个数

所以要变成非递归,我事实上不太理解非递归的,然后參考自己曾经做过的也是不太理解的这个代码http://blog.csdn.net/u011026968/article/details/38151303

然后AC

非递归版  46ms AC

//#pragma comment(linker, "/STACK:102400000,102400000")
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std; #define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const ll ll_INF = ((ull)(-1))>>1;
const double EPS = 1e-8;
const int INF = 100000000;
const int MAXN = 101;
const int S = 500000;
const int SIZE = 26;
const int LEN = 456976+3;
//const int MOD = 456976;
const int MOD =17576; char str[LEN+10];
char li[LEN*SIZE+10];
int sta[LEN*SIZE+10]; /*int dfs(int cnt, int s)
{
//printf("cnt=%d %d\n",cnt,s);
if(cnt == LEN)return 1;
for(int i=0;i<SIZE;i++)
{
if(!vis[(s*SIZE+i)%MOD])///
{
vis[(s*SIZE+i)%MOD]=1;
str[cnt]=i;
if(dfs(cnt+1, (s*SIZE+i)%MOD))return 1;
//vis[(s<<1)+i]=0;
}
}
return 0;
}*/
int tp,ans;
void sea(int v)
{
while(li[v]<SIZE)
{
int w=v*SIZE+li[v];
li[v]++;
sta[tp++]=w;
v=w%MOD;
}
}
void solve()
{
CL(str,0);
CL(li,0);
tp=0;
int v;
sea(0);
str[0]='a';
ans=1;
while(tp)
{
v=sta[--tp];
str[ans++]=v%SIZE+'a';
v/=SIZE;
sea(v);
}
} int main()
{
//OUT("hdu4850.txt");
solve();
int n;
while(~scanf("%d",&n))
{
if(n>LEN)puts("Impossible");
else
{
if(n<=4)
{
for(int i=0;i<n;i++)
putchar('a');
}
else
{
for(int i=1;i<4;i++)putchar('a');
int tt=ans;
n-=3;
while(tt>ans-n)putchar(str[--tt]);
}
putchar('\n');
}
}
return 0;
}

递归版 93ms AC

#pragma comment(linker, "/STACK:102400000,102400000")
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std; #define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const ll ll_INF = ((ull)(-1))>>1;
const double EPS = 1e-8;
const int INF = 100000000;
const int MAXN = 101;
const int S = 500000;
const int SIZE = 26;
const int LEN = 456976+3;
const int MOD = 456976; int str[LEN+10];
int vis[LEN+10]; int dfs(int cnt, int s)
{
//printf("cnt=%d %d\n",cnt,s);
if(cnt == LEN)return 1;
for(int i=0;i<SIZE;i++)
{
if(!vis[(s*SIZE+i)%MOD])///
{
vis[(s*SIZE+i)%MOD]=1;
str[cnt]=i;
if(dfs(cnt+1, (s*SIZE+i)%MOD))return 1;
}
}
return 0;
} void init()
{
CL(str,0);
CL(vis,0);
vis[0]=1;
dfs(4,0);
} int main()
{
//OUT("hdu4850.txt");
init();
int n;
while(~scanf("%d",&n))
{
if(n>LEN)puts("Impossible");
else
{
for(int i=0;i<n;i++)
putchar(str[i]+'a');
putchar('\n');
}
}
return 0;
}

hdu 4850 字符串构造---欧拉回路构造序列 递归+非递归实现的更多相关文章

  1. Reverse Linked List 递归非递归实现

    单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...

  2. 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)

    一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...

  3. 全排列问题(递归&非递归&STL函数)

    问题描述: 打印输出1-9的所有全排序列,或者打印输出a-d的全排列. 思路分析: 将每个元素放到余下n-1个元素组成的队列最前方,然后对剩余元素进行全排列,依次递归下去. 比如:1 2 3 为例首先 ...

  4. 二叉树的递归,非递归遍历(C++)

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

  5. 二叉树总结—建树和4种遍历方式(递归&&非递归)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...

  6. 二叉树的先序、中序以及后序遍历(递归 && 非递归)

    树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...

  7. 二叉树——遍历篇(递归/非递归,C++)

    二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...

  8. 树的广度优先遍历和深度优先遍历(递归非递归、Java实现)

    在编程生活中,我们总会遇见树性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程.现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的) 1.广度优先遍历 英文缩写为BFS即B ...

  9. java:合并两个排序的链表(递归+非递归)

    //采用不带头结点的链表 非递归实现 public static ListNode merge(ListNode list1,ListNode list2){ if(list1==null) retu ...

随机推荐

  1. html基础代码演示2

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  2. 【Leetcode】84. Largest Rectangle in Histogram 85. Maximal Rectangle

    问题描述: 84:直方图最大面积. 85:0,1矩阵最大全1子矩阵面积. 问题分析: 对于84,如果高度递增的话,那么OK没有问题,不断添加到栈里,最后一起算面积(当然,面积等于高度h * disPo ...

  3. Unity Toast插件(UGUI版)

    简介 介于自己之前经历的一些开发过程,非常希望unity能有类似Toast的功能用于一些简单的信息显示.但是找来找去找了半天,都木有发现,实在是憋不住了,自己写了个,感觉还可以用,发出来共享一下... ...

  4. HTML 表格与表单 个人简历

    <title>个人简历</title></head> <body background="1e30e924b899a9015b946ac41f950 ...

  5. Android 6.0一个完整的native service

     上一篇博客<Android 6.0 如何添加完整的系统服务(app-framework-kernel)>http://www.cnblogs.com/hackfun/p/7418902. ...

  6. [Windows Server 2012] Discuz X3安全设置

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★[护卫神·V课堂]是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Discu ...

  7. illumina测序原理

    一些常用基本概念的介绍: flowcell流动池 是指Illumina测序时,测序反应发生的位置,1个flowcell含有8条lane lane通道 每一个flowcell上都有8条泳道,用于测序反应 ...

  8. SQL几种常用的函数

    函数的种类: 算数函数(数值计算的函数) 字符串函数(字符串操作的函数) 日期函数(用来进行日期操作的函数) 转换函数(用来转换数据类型和值的函数) 聚合函数(用来进行数据聚合的函数) 算数函数(+- ...

  9. Unity的分辨率

    问题: 强制设置程序运行的分辨率 解决办法: 在程序开始运行时就对分辨率进行设定 设定方法如下: void GetResolution() { int width = Screen.currentRe ...

  10. mitmproxy安装与使用

    mitmproxy安装与使用 (抓包,中间人代理工具.支持SSL) 在开发微信公端的时候开发调试只能用浏览器自带开发工具,本来移动端可以用用fiddler.wireshark等工具来抓包,但是自从改用 ...