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\n");

58         }

59         else

60         {

61            for( int i = 0 ; i < t ; i++ )

62            {

63                printf("%c", s[i]);

64            }

65            printf("\n");

66         }

67     }

68 }
View Code

 

你可能感兴趣的:(String)