无序字母对
题目描述
给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。
输入
第一行输入一个正整数n。
以下n行每行两个字母,表示这两个字母需要相邻。
输出
输出满足要求的字符串。
如果没有满足要求的字符串,请输出“No Solution”。
如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案
样例输入
4
aZ
tZ
Xt
aX
样例输出
XaZtX
提示
【数据规模与约定】
n<=1326
代码:
1 #include<cstdio> 2 #define H 0x6ffffff 3 int n, c = 0, map[60][60], d[60], ans[2000], s = H, ss = H, x, y, v, t = 0; 4 char z[3]; 5 6 int turn(char c){ 7 return c - 'A' + 1; 8 } 9 10 char nrut(int a){ 11 return a + 'A' - 1; 12 } 13 14 void dfs(int i) { 15 for (int j = 1; j <= v; j++) { 16 if(map[i][j]>0){ 17 map[i][j]--; 18 map[j][i]--; 19 dfs(j); 20 } 21 } 22 ans[++c] = i; 23 } 24 25 int main() { 26 scanf("%d", &n); 27 for (int i = 1; i <= n; i++){ 28 scanf("%s", z + 1); 29 x = turn(z[1]); 30 y = turn(z[2]); 31 map[x][y]++; 32 map[y][x]++; 33 d[x]++; 34 d[y]++; 35 if (x > v) { 36 v = x; 37 } 38 if (y > v) { 39 v = y; 40 } 41 } 42 for (int i = 1; i <= v; i++) { 43 if(d[i] % 2 == 1) { 44 if(s == H) { 45 s = i; 46 } 47 t++; 48 } 49 if (d[i] > 0 && ss == H) { 50 ss = i; 51 } 52 } 53 if (t != 0 && t != 2) { 54 printf("No Solution"); 55 return 0; 56 } 57 if (s == H) { 58 dfs(ss); 59 } 60 else { 61 dfs(s); 62 } 63 if (c - 1 != n) { 64 printf("No Solution"); 65 } 66 else { 67 for (int i = c; i >= 1; i--) { 68 printf("%c", nrut(ans[i])); 69 } 70 } 71 return 0; 72 }