Wow! Such String!
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1371 Accepted Submission(s): 453
Special Judge
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?
For each test case, there will be one line containing one integer N (1 ≤ N ≤ 500000).
Sum of all N will not exceed 5000000.
5 3 11 10 6 17 8
pwned wow suchproblem manystring soeasy muchlinearalgebra abcdabch
Wow! Such String!
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1371 Accepted Submission(s): 453
Special Judge
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?
For each test case, there will be one line containing one integer N (1 ≤ N ≤ 500000).
Sum of all N will not exceed 5000000.
5 3 11 10 6 17 8
pwned wow suchproblem manystring soeasy muchlinearalgebra abcdabch
题意:输出长度为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[n];
str[n]=0;
printf("%s\n",str);
str[n]=tem;
}
return 0;
}