hdu 4850 Wow! Such String! 构造 欧拉回路
2017-09-12 21:03
344 查看
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 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
链接 http://acm.hdu.edu.cn/showproblem.php?pid=4850
题意:输出长度为n,长度为4的子串不能重复出现的 小写字母组成的 字符串。
做法:最大长度为4的字符串一共有 26^4个, 如果他们都能连接 如 aaaa 和aaab 可以连接为 aaaab。 如果能都连接的话,最长 长度为26^4+3= 456979。
构造,先把 相同的 构造好, aaaabbbbccccdddd.....yyyyzzzz。把出现过的存在一个4维数组里 如 aaaa,就把dp[0][0][0][0]=1。 如 aazz 就把dp[0][0][25][25]=1;
然后继续构造下一个字母,从最大的字母开始凑接下来一个字母 z不行,因为四个z已经出现过,所以填入y。
这个是这种方法构造出来的 前面一部分的构造结果。
aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrsssstttt
uuuuvvvvwwwwxxxxyyyyzzzzyzzyyzyzyyyxzzzxzzyxzyzxzyyxyzzxyzyxyyzxyyxxzzxxzyxxyzxx
yxzxzxyxyxxxzxxxwzzzwzzywzzxwzyzwzyywzyxwzxzwzxywzxxwyzzwyzywyzxwyyzwyyywyyxwyxz
wyxywyxxwxzzwxzywxzxwxyzwxyywxyxwxxzwxxywxxwwzzwwzywwzxwwyzwwyywwyxwwxzwwxywwxwz
经常见到的一类构造问题。这种问题普遍就是 要求 构造一段 长度 然后在这个长度内 某长度的子串没有重复出现。
看了题解,知道了这类题的理论基础是欧拉回路。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <stack>
#include <queue>
#include <vector>
#include <deque>
#include <set>
#include <sstream>
#define eps 0.00001
#define LL __int64
#define pi acos(-1.0)
//456979
set<string>my;
char str[457000];
int dp[26][26][26][26];
int main()
{
str[0]=str[1]=str[2]='a';
string tem;
string mat;
memset(str,0,sizeof str);
memset(dp,0,sizeof dp);
for(int i=0;i<26;i++)
{
for(int j=0;j<4;j++)
{
str[i*4+j]='a'+i;
}
}
for(int i=3;i<26*4;i++)
{
dp[str[i-3]-'a'][str[i-2]-'a'][str[i-1]-'a'][str[i]-'a']=1;
}
for(int i=26*4;i<456979;i++)
{
for(int j=25;j>=0;j--)
{
if(dp[str[i-3]-'a'][str[i-2]-'a'][str[i-1]-'a'][j]==0)
{
dp[str[i-3]-'a'][str[i-2]-'a'][str[i-1]-'a'][j]=1;
str[i]=j+'a';
break;
}
}
}
int n;
while(scanf("%d",&n)!=EOF)
{
if(n>456979)
{
printf("Impossible");
continue;
}
char tem=str
;
str
=0;
printf("%s\n",str);
str
=tem;
}
return 0;
}
相关文章推荐
- HDU - 4850 Wow! Such String! 构造(字符串上的欧拉回路)
- hdu 4850 Wow! Such String! 构造 欧拉回路
- HDU-4850 Wow! Such String! (构造)
- 构造字符串 之 hdu 4850 Wow! Such String!
- hdu 4850 Wow! Such String! 欧拉回路
- 构造字符串 之 hdu 4850 Wow! Such String!
- HDU 4850 Wow! Such String!(构造推理)
- HDU-4850 Wow! Such String! (构造)
- HDU_4850_Wow! Such String!(构造)
- HDU 4850 Wow! Such String! 欧拉回路
- hdu 4850 Wow! Such String!(欧拉回路)
- hdu 4850 Wow! Such String! 构造 或 欧拉路径并改写成非递归版本
- 【HDU】4850 Wow! Such String! 提出猜想题
- 【HDU】4850 Wow! Such String! 提出猜想题 欧拉道路
- hdu 4850 Wow! Such String! 2014西安全国邀请赛
- hdu 4850 Wow! Such String!(字符串处理,yy)
- HDU 4850 2014西安邀请赛 D题 Wow! Such String!
- HDU 4850 2014西安邀请赛 D题 Wow! Such String!
- HDU 4850 Wow! Such String!(欧拉道路)
- HDU 4850 Wow! Such String!(欧拉道路)