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的字符串,然后依次向结尾添加符合条件的字符串,直到遍历完所有的边为止。
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }