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. 3CSS基本语法

    ------------------------- --------------------------------------- -------------------------------- & ...

  2. html表单代码演示

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

  3. IIS 配置 SVC

    IIS8中添加WCF支持几种方法小结[图文] 方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不 ...

  4. Jquery音频播放插件下载地址(有Html、JS、CSS、音频)

    有详细的html文件.全部JS代码文件.Css样式文件.测试音频资料 音频播放插件下载链接(百度云): http://pan.baidu.com/s/1pKC904F 提取码评论留邮箱发送,谢谢!

  5. WinForm窗体项目 之 MySchool管理系统终极版

    学习WinForm窗体程序也有一段时间了,今天就来尝试着来一个项目热热身~ 在我们通常使用的MySchool管理中,不外乎这几种功能:增.删.改.查.改密码 在过去的C#中确实是挺简单的,但是在学习了 ...

  6. cookie和sessionStorage 、localStorage 对比

    相同点:都存储在客户端 不同点:1.存储大小 cookie数据大小不能超过4k. sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或 ...

  7. 打造最强NGINX HTTPS

    SSL LABS 检测 完整配置如下 server { listen 443 ssl; server_name xxx.xxxke.com; ssl on; ssl_certificate /xxx/ ...

  8. Python 之类型转换

    # int(x[, base]) 将x转换为一个整数,base为进制,默认十进制 # # long(x[, base] ) 将x转换为一个长整数 # # float(x) 将x转换到一个浮点数 # # ...

  9. js的基础运用

    总结: 1.定义:分为隐式定义和显式定义可以先定义后赋值. 2.+:当两边都是数值则运行加法运算,若一遍是字符型则进行拼接. 3.数值变字符:数值变量.toString()方法. 字符变数值:通过加一 ...

  10. EF-Lamdba

    一丶基本语法 var userList=db.set<table>().where(c=>c.id=="001"&&c.userName.Cont ...