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. 关于 android屏幕适配

    一.关于布局适配 1.不要使用绝对布局 2.尽量使用match_parent 而不是fill_parent . 3.能够使用权重的地方尽量使用权重(android:layout_weight) 4.如 ...

  2. sql语句优化:用join取代not in

    不要太多使用not in查询,最好用表连接来取代它.如: select ID,name from Table_A where ID not in (select ID from Table_B) 这句 ...

  3. MVC系列学习(十七)-过滤器

    本次学习的文件结构如下 1.过滤器的几种表示方式 1.1将过滤器 加到方法上,作用范围为该方法 1.2将过滤器加到当前类上,作用范围为该类的所有方法 1.3添加全局过滤器,作用范围为所有方法 2.Ac ...

  4. [ SHOI 2001 ] 化工厂装箱员

    \(\\\) \(Description\) 传送带上按顺序传过来\(N\)个物品,一个有\(A,B,C\)三类. 每次装箱员手里只能至多拿十个,然后将手中三类物品中的一类装箱,才能接着拿或接着装箱, ...

  5. Less文件的建立

    1.打开DreamWeaver 2.选择 新建 Less       文件名为.less,保存于Less文件夹中 3.声明文档头:@charset "utf-8"; 4.将Less ...

  6. Raspberry Pi开发之旅-光照强度检测(BH1750)

    一.前期准备 1.环境要求 GY30模块(BH1750FVI传感器),树莓派系统,python-smbus,iic开启 2.取消对IIC驱动的黑名单 nano /etc/modprobe.d/rasp ...

  7. 安卓发送图片文字,java后台接收

    安卓使用retrofit2 和rxjava2 url: @Multipart @POST(UrlTools.STORYUPLOAD) Observable<Result> saveRepo ...

  8. selenium的三种等待时间

    //隐式等待(20秒以内没哥一段时间就会去找元素,如果没找大也不会报错,过了20s才会报错) //driver.manage().timeouts().implicitlyWait(20, TimeU ...

  9. Uedior上传大文件超时报错

    出错原因: 1.php超时等待时间太短 2.uedior中设置了请求超时,提示信息: 上传失败,请重试 先解决第一个问题: 设置php.ini中的max_execution_time 为0 (意思是h ...

  10. [Luogu] P3413 萌数

    题目背景 本题由世界上最蒟蒻最辣鸡最撒比的SOL提供. 寂月城网站是完美信息教室的官网.地址:已和谐 . 题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只 ...