hdu 4850 字符串构造---欧拉回路构造序列 递归+非递归实现
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 字符串构造---欧拉回路构造序列 递归+非递归实现的更多相关文章
- Reverse Linked List 递归非递归实现
单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...
- 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)
一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...
- 全排列问题(递归&非递归&STL函数)
问题描述: 打印输出1-9的所有全排序列,或者打印输出a-d的全排列. 思路分析: 将每个元素放到余下n-1个元素组成的队列最前方,然后对剩余元素进行全排列,依次递归下去. 比如:1 2 3 为例首先 ...
- 二叉树的递归,非递归遍历(C++)
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...
- 二叉树总结—建树和4种遍历方式(递归&&非递归)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...
- 二叉树的先序、中序以及后序遍历(递归 && 非递归)
树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...
- 二叉树——遍历篇(递归/非递归,C++)
二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...
- 树的广度优先遍历和深度优先遍历(递归非递归、Java实现)
在编程生活中,我们总会遇见树性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程.现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的) 1.广度优先遍历 英文缩写为BFS即B ...
- java:合并两个排序的链表(递归+非递归)
//采用不带头结点的链表 非递归实现 public static ListNode merge(ListNode list1,ListNode list2){ if(list1==null) retu ...
随机推荐
- scala函数用法
直接上代码. package com.test.scala.test object Function { def main(args: Array[String]): Unit = { println ...
- Laravel 5.4.36 session 发现
由于Laravel session机制完全脱离了PHP自带的session机制 因此对于php.ini 配置session对Laravel 是不会产生影响 代码路径: vendor/larav ...
- 【sqli-labs】 less47 GET -Error based -String -Order By Clause(GET型基于错误的字符型Order By从句注入)
http://192.168.136.128/sqli-labs-master/Less-47/?sort=1 改变sort的值,结果仍然是order by 1的结果 http://192.168.1 ...
- RocketMQ学习笔记(4)----RocketMQ搭建双Master集群
前面已经学习了RockeMQ的四种集群方式,接下来就来搭建一个双Master(2m)的集群环境. 1. 双Master服务器环境 序号 ip 用户名 密码 角色 模式 (1) 47.105.145.1 ...
- std::vector遍历
std::vector是我在标准库中实用最频繁的容器.总结一下在遍历和创建vector时需要注意的一些地方. 在不考虑线程安全问题的前提下,在C++11中有五种遍历方式. 方式一 for (size_ ...
- windons共享的一些问题
有时候访问共享一直说无法打开共享,但是别人确实是开了共享. 其中可能如下: 1.首先确定网络没有问题,win+R输入cmd,ping对方IP地址,保证是网络是通的,如果不通,关闭共享电脑的防火墙. 2 ...
- form:input 标签使用
<form:input path="suplier" htmlEscape="false" maxlength="50" id=&qu ...
- c++ map: 使用struct或者数组做value
Notice 如果是program中有两个map对象,可能你需要两个map iterator,但是注意两个iter object不能命名一样,可以分别为iter1, iter2 Example #in ...
- linux环境图数据库neo4j安装
自定义yum源 Neo4j Stable Yum Repo First, you'll want our key: cd /tmp wget http://debian.neo4j.org/neote ...
- 字符串匹配的BF算法和KMP算法学习
引言:关于字符串 字符串(string):是由0或多个字符组成的有限序列.一般写作`s = "123456..."`.s这里是主串,其中的一部分就是子串. 其实,对于字符串大小关系 ...