HDU-4850 Wow! Such String! (构造)

Problem Description

Recently, doge starts to get interested in a strange problem: whether there exists a string A following all the rules below:

1.The length of the string A is N .
2.The string A contains only lowercase English alphabet letters.
3.Each substring of A with length equal to or larger than 4 can appear in the string exactly once.

Doge cannot solve the problem, so he turns to his brother Yuege for
help. However, Yuege is busy setting problems. Would you please help
doge solve this problem?

Input

There are several test cases, please process till EOF.
For each test case, there will be one line containing one integer N (1 ≤ N ≤ 500000).
Sum of all N will not exceed 5000000.

Output

For each case, please output one line consisting a valid string if
such a string exists, or “Impossible” (without quotes) otherwise. You
can output any string if there are multiple valid ones.

Sample Input

5

3

11

10

6

17

8

Sample Output

pwned

wow

suchproblem

manystring

soeasy

muchlinearalgebra

abcdabch

题目大意:构造出一个长度已知并且长度不小于4的子串只出现一次的全由小写字母组成的字符串。

题目分析:由26个小写字母组成的长度为4的字符串总共有26^4个,也就是说,这个字符串最多有26^4种子串,所以最长长度为26^4+3。接下来把这个最长的构造出来就行了。

代码如下:

# include<iostream>
# include<cstdio>
# include<map>
# include<string>
# include<cstring>
# include<algorithm>
using namespace std;
const int N=26*26*26*26+3;
int vis[26][26][26][26],n;
char ans[N+10];
void get_ans()
{
    memset(vis,0,sizeof(vis));
    int pos=0;
    for(char a=‘a‘;a<=‘z‘;++a)
        ans[pos++]=a,ans[pos++]=a,ans[pos++]=a,ans[pos++]=a;
    for(int i=3;i<104;++i)
        vis[ans[i-3]-‘a‘][ans[i-2]-‘a‘][ans[i-1]-‘a‘][ans[i]-‘a‘]=1;
    char a=‘z‘;
    while(pos<456979){
        int cnt=0;
        for(int c=a+1;cnt<2;++c){
            if(c>‘z‘){
                c=‘a‘;
                ++cnt;
            }
            if(vis[ans[pos-3]-‘a‘][ans[pos-2]-‘a‘][ans[pos-1]-‘a‘][c-‘a‘])
                continue;
            vis[ans[pos-3]-‘a‘][ans[pos-2]-‘a‘][ans[pos-1]-‘a‘][c-‘a‘]=1;
            ans[pos++]=c;
            a=c;
            break;
        }
    }
}
int main()
{
    get_ans();
    while(~scanf("%d",&n))
    {
        if(n>N){
            printf("Impossible\n");
            continue;
        }
        for(int i=0;i<n;++i)
            printf("%c",ans[i]);
        printf("\n");
    }
    return 0;
}

  

时间: 2024-10-18 02:04:36

HDU-4850 Wow! Such String! (构造)的相关文章

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 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! 【欧拉回路】【一顿乱构造】

link: http://acm.hdu.edu.cn/showproblem.php?pid=4850 题解: 每个长度为3的字符串当一个节点,每个节点连出26条边,代表给长度为3的字符串吼添加'a'~'z' 那我们每条边经过一次,就能构造出长度为26^4 + 3的字符串! 我们从"aaa"表示的节点出发,注意到每个点出度为26,入度也为26. 所以,非"aaa"的节点,能进去就能离开.(因为这些点是:先入再出) "aaa"表示的节点,进入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

HDU 4849 Wow! Such City!陕西邀请赛C(最短路)

HDU 4849 Wow! Such City! 题目链接 题意:按照题目中的公式构造出临接矩阵后,求出1到2 - n最短路%M的最小值 思路:就根据题目中方法构造矩阵,然后写一个dijkstra,利用d数组取求答案即可 代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const long long I