1. 程式人生 > >洛谷P1341 無序字母對

洛谷P1341 無序字母對

article code 不同 using urn 輸入輸出格式 log std 字典

P1341 無序字母對

題目描述

給定n個各不相同的無序字母對(區分大小寫,無序即字母對中的兩個字母可以位置顛倒)。請構造一個有n+1個字母的字符串使得每個字母對都在這個字符串中出現。

輸入輸出格式

輸入格式:

第一行輸入一個正整數n。

以下n行每行兩個字母,表示這兩個字母需要相鄰。

輸出格式:

輸出滿足要求的字符串。

如果沒有滿足要求的字符串,請輸出“No Solution”。

如果有多種方案,請輸出前面的字母的ASCII編碼盡可能小的(字典序最小)的方案

輸入輸出樣例

輸入樣例#1: 復制
4
aZ
tZ
Xt
aX
輸出樣例#1: 復制
XaZtX
 

說明

【數據規模與約定】

不同的無序字母對個數有限,n的規模可以通過計算得到。

/*
    將字母轉化成點,每一對字母組之間連點,問題轉化為找歐拉路徑。註意幾點:
    1.字典序
    2.判斷是否有歐拉路徑,可以根據定義,歐拉路徑中沒有或有兩個度數為奇數的點。
    3.判斷是歐拉路經還是歐拉回路。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 600
using namespace
std; 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 無序字母對