HDU 4850 Wow! Such String!
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4850
题意:给定一个N(1 ≤ N ≤ 500000),构造一个长度为N的小写字母字符串,要求所有长度大于等于4的子串只能出现一次。不能构造输出“Impossible”。
(1).只需要考虑长度等于4的子串的情况。
(2).长度为4的小写字母子串组合共有26^4种,故最长只可能构造出26^4+3长度的字符串。
(3).若一个一个添加字符,当N>3时,每次添加一个字符,末尾的三个字符和新的字符就会构成一个新的长度为4的子串。
(4).抽象出图的模型:末尾的3个字符共有26^3种组合,每种抽象成一个节点。每个节点添加新字符有26种情况,抽象成26条有向边,指向转化后的节点。每经过一条图中的边,就是构造一个长度为4的子串的过程。如果长度为4的子串不能重复,那么每条边就至多只能走一次。
(5).图中每个节点的出度和入度都是26,根据定理,该有向图存在欧拉回路,且可以从任意一点作为出发点。那么图中所有的边都可以走过一次,构造出长度为26^4+3的字符串。
有向图欧拉回路的求法可以用套圈算法,写成非递归的形式,递归的形式会爆栈。
#include <cstdio>
#include <cstring> using namespace std; const int maxn = (**);
const int mod = (*);
const int maxm = ;
bool vis[maxn][]; int get_next(int now,int i)
{
return (now%mod)*+i;
}
int cur[maxn];
struct node
{
int n,c;
}st[maxm];
char ans_str[maxm];
int str_len;
void euler(int now)
{
int top=;
memset(cur,,sizeof(cur));
memset(vis,,sizeof(vis));
do
{
bool ff=false;
for(int i=cur[now];i<;++i)
{
if(vis[now][i])continue;
vis[now][i]=true;
cur[now]=i+;
now=get_next(now,i);
st[++top].n=now;
st[top].c=i;
ff=true;
break;
}
if(!ff)
{
ans_str[str_len++]=st[top].c+'a';
now=st[--top].n;
}
}while(top);
} void init()
{
str_len=;
euler();
for(int i=;i<;++i)
ans_str[str_len++]='a';
ans_str[str_len]=;
}
int main()
{
init();
int n;
while(~scanf("%d",&n))
{
if(n>str_len)
puts("Impossible");
else
{
for(int i=;i<n;++i)
printf("%c",ans_str[i]);
puts("");
}
}
return ;
}
HDU 4850 Wow! Such String!的更多相关文章
- hdu 4850 Wow! Such String! 欧拉回路
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4080264.html 题目链接:hdu 4850 Wow! Such String! 欧拉回 ...
- HDU 4850 Wow! Such String!(欧拉道路)
HDU 4850 Wow! Such String! 题目链接 题意:求50W内的字符串.要求长度大于等于4的子串,仅仅出现一次 思路:须要推理.考虑4个字母的字符串,一共同拥有26^4种,这些由这些 ...
- hdu 4850 Wow! Such String!(字符串处理,yy)
题目 参考了博客http://blog.csdn.net/u013368721/article/details/37575165 //用visit[26][26][26][26]来判断新家新区的子母河 ...
- HDU 5842 Lweb and String(Lweb与字符串)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- hdu 3553 Just a String (后缀数组)
hdu 3553 Just a String (后缀数组) 题意:很简单,问一个字符串的第k大的子串是谁. 解题思路:后缀数组.先预处理一遍,把能算的都算出来.将后缀按sa排序,假如我们知道答案在那个 ...
- hdu 4893 Wow! Such Sequence!(线段树)
题目链接:hdu 4983 Wow! Such Sequence! 题目大意:就是三种操作 1 k d, 改动k的为值添加d 2 l r, 查询l到r的区间和 3 l r. 间l到r区间上的所以数变成 ...
- HDU 4849 Wow! Such City!陕西邀请赛C(最短路)
HDU 4849 Wow! Such City! 题目链接 题意:依照题目中的公式构造出临接矩阵后.求出1到2 - n最短路%M的最小值 思路:就依据题目中方法构造矩阵,然后写一个dijkstra,利 ...
- HDU4850 Wow! Such String! —— 字符串构造
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4850 代码如下: #include <iostream> #include <cst ...
- hdu 4850 字符串构造---欧拉回路构造序列 递归+非递归实现
http://acm.hdu.edu.cn/showproblem.php? pid=4850 题意:构造长度为n的字符序列.使得>=4的子串仅仅出现一次 事实上最长仅仅能构造出来26^4+4- ...
随机推荐
- Mybatis的一级二级缓存
Mybatis提供了缓存机制,可以减轻数据库的压力,提高性能 Mybatis的缓存分为两级:一个是一级缓存,一个二级缓存 一级缓存:即默认使用的缓存SqlSession级别的缓存,只在sqlsessi ...
- LAMP 服务器环境
学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我介绍一下LAMP环境的搭建,即Linux.Apache.MySQL.PHP环境. 一. ...
- 树莓派--bcm2835 library (2) 交叉编译BCM2835
在上文中,按照guide, 在树莓派目标板上install bcm2835. 因为bcm2835是用户空间应用,所以可以在宿主机上交叉编译,生成binary后在树莓派执行 按照guide: Insta ...
- MySQL-----查
数据库在我眼中就是增删改查,而查,我觉得是数据库最费劲的,数据库的花式查,各种查.下面咱们不废话,就是干. 查: **查数据库版本** select version(); **查登录用户** sele ...
- 优先队列重载运算符< 以及初始化列表
优先队列定义 priority_queue<int, vector<int>, greater<int> >pq; 优先队列重载<运算符 在结构体中定义一个 ...
- IntelliJ IDEA 13.1.1版本偶然的错误
总之很悲催也很浪费时间,这款软件很喜欢,不想卸载 图片中的style.css使得style.css一直是文本形式 将style.css删除就恢复正常了,这个错误弄了半天才搞定,心累.
- 九度oj 题目1056:最大公约数
题目1056:最大公约数 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8068 解决:5317 题目描述: 输入两个正整数,求其最大公约数. 输入: 测试数据有多组,每组输入两个正整数. ...
- 全排列函数 nyoj 366(next_permutation()函数)
C++ STL中提供了std::next_permutation与std::prev_permutation可以获取数字或者是字符的全排列,其中std::next_permutation提供升序.st ...
- [luoguP1082] 同余方程(扩展欧几里得)
传送门 ax≡1(mod b) 这个式子就是 a * x % b == 1 % b 相当于 a * x - b * y == 1 只有当 gcd(a,b) == 1 时才有解,也就是说 ax + by ...
- codevs3728 联合权值
题目描述 Description 输入描述 Input Description 输出描述 Output Description 样例输入 Sample Input 样例输出 Sample Output ...