hdu 4850 Wow! Such String! 欧拉回路

作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4080264.html

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

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

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

代码如下:

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include <cstring>
 5 #define     MAXN 500001
 6 char s[MAXN];
 7 bool vis[26][26][26][26];
 8 int n;
 9 using namespace std;
10 void solve()
11 {
12     memset(vis, 0, sizeof(vis));
13     n = 0;
14     for( int i = 0 ; i < 26 ; i++ )
15     {
16         for( int j = 0 ; j < 4 ; j++ )
17         {
18             s[i*4+j] = i+'a';
19             n++;
20         }
21     }
22     for( int i = 0 ; i < 25 ; i++ )
23     {
24         vis[i][i][i][i] = true;
25         vis[i][i][i][i+1] = true;
26         vis[i][i][i+1][i+1] = true;
27         vis[i][i+1][i+1][i+1] = true;
28     }
29     vis[25][25][25][25] = true;
30     while( 1 )
31     {
32         int i = 25;
33         while(i>=0)
34         {
35             if( vis[s[n-3]-'a'][s[n-2]-'a'][s[n-1]-'a'][i] == false )
36             { 
37                 vis[s[n-3]-'a'][s[n-2]-'a'][s[n-1]-'a'][i] = true;
38                 s[n++] = i+'a';
39                 break;
40             }
41             i--;
42         }
43         if( i < 0)
44         {
45             break;
46         }
47     }
48 }
49 int main(int argc, char *argv[])
50 {
51     solve();
52     int t;
53     while( scanf("%d", &t ) != EOF)
54     {
55         if( t > n )
56         {
57             printf("Impossible
");
58         }
59         else
60         {
61            for( int i = 0 ; i < t ; i++ )
62            {
63                printf("%c", s[i]);
64            }
65            printf("
");
66         }
67     }
68 }
View Code
原文地址:https://www.cnblogs.com/jostree/p/4080264.html