HDU 4850 Wow! Such String! 【欧拉回路】【一顿乱构造】

link: http://acm.hdu.edu.cn/showproblem.php?pid=4850

题解:

每个长度为3的字符串当一个节点,每个节点连出26条边,代表给长度为3的字符串吼添加‘a‘~‘z‘

那我们每条边经过一次,就能构造出长度为26^4 + 3的字符串!

我们从"aaa"表示的节点出发,注意到每个点出度为26,入度也为26。

所以,非"aaa"的节点,能进去就能离开。(因为这些点是:先入再出)

"aaa"表示的节点,进入26次后就再也出不去了。("aaa":先出再入)

所以啊,我们尽可能的不回"aaa"节点。三顾家门而不入(( ≧?≦))

#include <iostream>
using namespace std;
const int NICO = 26*26*26*26+3;
int used[26][26][26][26];
int a[500000];
void init()
{
    a[1] = a[2] = a[3] = 0;
    for(int i=4;i<=NICO;i++)
    {
        for(int j=25;j>=0;j--)
        {
            if(used[a[i-3]][a[i-2]][a[i-1]][j] == 0)
            {
                used[a[i-3]][a[i-2]][a[i-1]][j] = 1;
                a[i] = j;
                break;
            }
        }
    }
}
int n;
int main()
{
    init();
    while(~scanf("%d", &n))
    {
        if(n > NICO)
        {
            printf("Impossible\n");
        } else {
            for(int i=1;i<=n;i++)
            {
                printf("%c", a[i] + ‘a‘);
            }
            printf("\n");
        }
    }
}

  

训练赛的时候,智障の队友写的DFS各种爆栈, MLE,(`?ω′? )v。

然后智障の队友突然觉醒了,优化一波后AC了。【好吧,虽然我更智障】

但还是觉得贪心构造更加赏心悦目!

时间: 2024-10-13 23:29:28

HDU 4850 Wow! Such String! 【欧拉回路】【一顿乱构造】的相关文章

hdu 4850 Wow! Such String!(欧拉回路)

题目链接:hdu 4850 Wow! Such String! 题目大意:给定一个n,要求输出一个长度为n的字符串,并且不会有长度大于等于4的重复的子串,不能得到输出impossible. 解题思路:这题有一个误导性的地方,500000,其实是构造不到那么长的,我们考虑所有不相同并且长度为4的串,一共有s=264个,那么我们假设有一个很长的串,满足不会有长度大于等于4的重复的子串,那么以0,1,2,3...的位置为起始,长度为4的子串一定都是s中的某一个串,因为不重复,所以肯定只有264个位置做

hdu 4850 Wow! Such String!

这是当时西安邀请赛的题目,也就是因为这道题,我们无缘银牌... 其实这道题的大致想法当时我想出来了,就是我是想找到一条通过所有顶点的通路,顶点是所有的长度是4的子串.但是当时没有尝试搜索,以为不会这么简单就找到那条路.但是现在明白了,对于所有顶点度数为偶数的图,一定可以找到这样一条路的. 下面是代码 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const in

HDU 4850 Wow! Such String!(欧拉道路)

HDU 4850 Wow! Such String! 题目链接 题意:求50W内的字符串,要求长度大于等于4的子串,只出现一次 思路:需要推理,考虑4个字母的字符串,一共有26^4种,这些由这些字符串,如果一个字符串末尾加上一个字符,可以变成另一个字符串的话,就当作这有一条边,每多一个字符多一个结点,那么对于这道题目,一共就能有26^4 + 3条边,在加上尾巴可以多放3个,一共是26^4+3个边,这些边全部连起来就是要的字符串,这样就可以知道每个节点会经过的次数为26,这样就只要考虑如何把这些节

hdu 4850 Wow! Such String!(字符串处理,yy)

题目 参考了博客http://blog.csdn.net/u013368721/article/details/37575165 //用visit[26][26][26][26]来判断新家新区的子母河前三个组合而成的4个字符的串是否和之前的重复. //再加上最初三个字符,所以,总共有26*26*26*26+3的长度. /* //以下复制自博客http://blog.csdn.net/u013368721/article/details/37575165 题目大意:给你一个整数n,让你输出一个字符

hdu 4850 Wow! Such String! 构造 欧拉回路

Wow! Such String! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 934    Accepted Submission(s): 318 Special Judge Problem Description Recently, doge starts to get interested in a strange probl

hdu 4850 Wow! Such String! 构造 或 欧拉路径并改写成非递归版本

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4850 跟这道题也算是苦大仇深了... 题意:构造一个由26个小写字母组成的.无长度为4的重复子串的字符串(要求出能构造出的最大长度) 符合要求的长度为4的字符串有4^26个 容易猜最大长度是:4^26+3 = 456979 比赛的时候想法是要让各个字母出现得尽量“均匀” 用了一个cnt数组记录26个字母出现的次数 每次都选择出现次数最小的.不与前面重复的字母加上去 然而稍微写得有点歪,最后构造出了长

HDU 4893 Wow! Such Sequence! 水线段树

思路: 线段树走起.. 写完这题就退役T^T 单点更新的时候直接找到这个点的最近fib,然后维护当前和 和 fib的和 #include<stdio.h> #include<string.h> #include<iostream> #include<math.h> #include<algorithm> #include<queue> #include<map> #include<set> #include&l

hdu 4848 Wow! Such Conquering! (暴搜+强剪枝)

Wow! Such Conquering! Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description There are n Doge Planets in the Doge Space. The conqueror of Doge Space

Wow! Such String!

题目链接 题意: 给一个n,输出一个长度为n的字符串,使得串中任意相连四个字符组成的串不重复N (1 ≤ N ≤ 500000) 分析: const int MAXV = 18278; const int MAXE = 475228; struct Edge { int from, to; }; struct Direct_Euler { int n, m; int out[MAXV]; bool vis[MAXE]; vector<int> G[MAXV]; vector<Edge&g