题目描述
给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。
输入输出格式
输入格式:
第一行输入一个正整数n。
以下n行每行两个字母,表示这两个字母需要相邻。
输出格式:
输出满足要求的字符串。
如果没有满足要求的字符串,请输出“No Solution”。
如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案
输入输出样例
输入样例#1:
4 aZ tZ Xt aX
输出样例#1:
XaZtX
说明
【数据规模与约定】
不同的无序字母对个数有限,n的规模可以通过计算得到。
分析:
本题只需要对每两个字母连一条无向边,然后跑一边欧拉回路即可,所以我又水了一道模板题???
CODE:
1 #include <cmath> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 const int M=1005; 8 int rd[M],n,g[M][M],tot; 9 char re[3],pat[M]; 10 int work(char c){ 11 if (c>='A'&&c<='Z') return c-'A'+1; 12 return c-'a'+27; 13 } 14 char work2(int c){ 15 if (c<=26) return c+'A'-1; 16 return c-27+'a'; 17 } 18 void add(int x,int y){ 19 rd[x]++,rd[y]++; 20 g[x][y]=g[y][x]=1; 21 return; 22 } 23 void dfs(int now){ 24 for (int i=1;i<=52;i++){ 25 if (!g[now][i]) continue; 26 g[now][i]=g[i][now]=0;dfs(i); 27 } 28 pat[++tot]=work2(now); 29 return; 30 } 31 int main(){ 32 scanf("%d",&n); 33 for (int i=1;i<=n;i++){ 34 scanf("%s",re+1); 35 add(work(re[1]),work(re[2])); 36 } 37 int now=0,fir=53; 38 for (int i=1;i<=52;i++) 39 if (rd[i]&1) now++,fir=min(fir,i); 40 if (now&&now-2){printf("No Solution");return 0;} 41 if (now) dfs(fir); 42 else { 43 for (int i=1;i<=52;i++) if (rd[i]) fir=min(fir,i); 44 dfs(fir); 45 } 46 for (int i=tot;i>=1;i--) putchar(pat[i]); 47 return 0; 48 }