您的位置:首页 > 其它

hdu 4850 Wow! Such String! 欧拉回路

2014-11-07 00:00 411 查看
作者:jostree 转载请注明出处 /article/7172708.html

题目链接:hdu 4850 Wow! Such String! 欧拉回路

长度为4的由26个字母组成的字符串一共有$4^{26}$种,从aaaa开始,在加上结尾的aaa那么该字符串长度为$4^{26}+3$。当字符串i的后三个字母和字符串j的前三个字母相同则ij有一条边,遍历所有的边可以构成一个欧拉回路。

首先构造aaaabbbb...zzzz的字符串,然后依次向结尾添加符合条件的字符串,直到遍历完所有的边为止。

代码如下:

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#define     MAXN 500001
char s[MAXN];
bool vis[26][26][26][26];
int n;
using namespace std;
void solve()
{
memset(vis, 0, sizeof(vis));
n = 0;
for( int i = 0 ; i < 26 ; i++ )
{
for( int j = 0 ; j < 4 ; j++ )
{
s[i*4+j] = i+'a';
n++;
}
}
for( int i = 0 ; i < 25 ; i++ )
{
vis[i][i][i][i] = true;
vis[i][i][i][i+1] = true;
vis[i][i][i+1][i+1] = true;
vis[i][i+1][i+1][i+1] = true;
}
vis[25][25][25][25] = true;
while( 1 )
{
int i = 25;
while(i>=0)
{
if( vis[s[n-3]-'a'][s[n-2]-'a'][s[n-1]-'a'][i] == false )
{
vis[s[n-3]-'a'][s[n-2]-'a'][s[n-1]-'a'][i] = true;
s[n++] = i+'a';
break;
}
i--;
}
if( i < 0)
{
break;
}
}
}
int main(int argc, char *argv[])
{
solve();
int t;
while( scanf("%d", &t ) != EOF)
{
if( t > n )
{
printf("Impossible\n");
}
else
{
for( int i = 0 ; i < t ; i++ )
{
printf("%c", s[i]);
}
printf("\n");
}
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: