欧拉路径 后6个点wa
#include<bits/stdc++.h>
using namespace std;
bool cmp(string a,string b){
return a<b;
}
struct word_edge{
int to;
string word;
};
vector<word_edge> g[27];
vector<bool>mar[27];
int n,du[27][2];
string a[1003];
queue<string> _out;
void dfs(int x){
for(int i=0;i<g[x].size();i++){
if(!mar[x][i]) {
mar[x][i]=1;
_out.push(g[x][i].word);
dfs(g[x][i].to);
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
int st=int(a[i][0]-'a'+1),en=int(a[i][a[i].length()-1]-'a'+1);
word_edge t;
t.to=en;
t.word=a[i];
g[st].push_back(t);
mar[st].push_back(0);
du[st][0]++;
du[en][1]++;
}
int s=0,t=0,s1=0,t1=0,sum=0;
for(int i=1;i<=26;i++){
//if(du[i][0]!=0||du[i][1]!=0) printf("%c 出:%d 入:%d\n",char(i+'a'-1),du[i][0],du[i][1]);
if(du[i][0]-du[i][1]==1) {
s++;
s1=i;
}
if(du[i][1]-du[i][0]==1) {
t++;
t1=i;
}
if(du[i][0]==du[i][1]) sum++;
}
if((s==1&&t==1&&sum+t+s==26)||(sum==26)){
if(s1==0) {
for(int i=1;i<=26;i++){
if(du[i][0]!=0) {
s1=i;
break;
}
}
}
dfs(s1);
if(_out.size()!=n){
printf("***");
return 0;
}
while(!_out.empty()) {
cout<<_out.front();
if(_out.size()>1) cout<<".";
_out.pop();
}
}
else printf("***");
return 0;
}