洛谷P1341 無序字母對
阿新 • • 發佈:2017-11-06
article code 不同 using urn 輸入輸出格式 log std 字典
輸出樣例#1: 復制
P1341 無序字母對
題目描述
給定n個各不相同的無序字母對(區分大小寫,無序即字母對中的兩個字母可以位置顛倒)。請構造一個有n+1個字母的字符串使得每個字母對都在這個字符串中出現。
輸入輸出格式
輸入格式:
第一行輸入一個正整數n。
以下n行每行兩個字母,表示這兩個字母需要相鄰。
輸出格式:
輸出滿足要求的字符串。
如果沒有滿足要求的字符串,請輸出“No Solution”。
如果有多種方案,請輸出前面的字母的ASCII編碼盡可能小的(字典序最小)的方案
輸入輸出樣例
輸入樣例#1: 復制4 aZ tZ Xt aX
XaZtX
說明
【數據規模與約定】
不同的無序字母對個數有限,n的規模可以通過計算得到。
/* 將字母轉化成點,每一對字母組之間連點,問題轉化為找歐拉路徑。註意幾點: 1.字典序 2.判斷是否有歐拉路徑,可以根據定義,歐拉路徑中沒有或有兩個度數為奇數的點。 3.判斷是歐拉路經還是歐拉回路。 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 600 using namespacestd; int n,du[maxn],cnt=0,s[maxn],cxt[maxn][maxn]; int change(char x){ if(x<=‘z‘&&x>=‘a‘)return x-‘a‘+27; else return x-‘A‘+1; } void Insert(int x,int y){ du[x]++;du[y]++; cxt[x][y]=cxt[y][x]=1; } void eular(int x){ for(int i=1;i<=52;i++){ if(cxt[x][i]){ cxt[x][i]=cxt[i][x]=0; eular(i); } } s[++cnt]=x; } int print(int x){ if(x<=26)return x+‘A‘-1; else return x-27+‘a‘; } int main(){ scanf("%d",&n); char ch[5]; for(int i=1;i<=n;i++){ scanf("%s",ch); Insert(change(ch[0]),change(ch[1])); } int p=0x7fffffff; for(int i=1;i<=52;i++) if(du[i]&1){ p=min(p,i); cnt++; } if(cnt!=0&&cnt!=2){ puts("No Solution"); return 0; } if(cnt==0){ for(int i=1;i<=52;i++) if(du[i]){p=i;break;} } cnt=0; eular(p); for(int i=cnt;i>=1;i--)printf("%c",print(s[i])); return 0; }
洛谷P1341 無序字母對