#include<bits/stdc++.h>
using namespace std;
vector<int> g[100005],v[100005];
struct edge
{
int q,s;
string wd;
}e[200005];
int in[100005],out[100005],nw[100005],now,step[200005];
bool cmp(edge a,edge b)
{
if(a.q==b.q)
{
if(a.s==b.s) return a.wd<b.wd;
else return a.s<b.s;
}
else return a.q<b.q;
}
int hsh(char c)
{
return c-'a'+1;
}
void dfs(int p,int k)
{
int s=g[p].size(),te;
for(int i=nw[p];i<s;i=max(i+1,nw[p]))
{
if(v[p][i]!=0)
{
te=v[p][i];
v[p][i]=0;
nw[p]=i+1;
dfs(g[p][i],te);
}
}
step[++now]=k;
}
int main()
{
int i,j,n,m,f,fl,k=1;
char st,ed;
cin>>n;
//freopen("P7771_10.in.txt","r",stdin);
//freopen("P7771_10.out","w",stdout);
for(i=1;i<=n;i++)
{
cin>>e[i].wd;
e[i].q=hsh(e[i].wd[0]);
e[i].s=hsh(e[i].wd[e[i].wd.size()-1]);
}
sort(e+1,e+n+1,cmp);
for(i=1;i<=n;i++)
{
out[e[i].q]++;
in[e[i].s]++;
g[e[i].q].push_back(e[i].s);
//cout<<g[e[i].q][g[i].size()]<<endl;
v[e[i].q].push_back(i);
}
f=fl=0;
for(i=1;i<=26;i++)
{
if(out[i]==in[i]+1)
{
if(f==1)
{
cout<<"***";
return 0;
}
else f=1,k=i;
}
else if(out[i]==in[i]-1)
{
if(fl==1)
{
cout<<"***";
return 0;
}
else fl=1;
}
else if(out[i]==in[i])
{
out[i]=in[i];
}
else
{
cout<<"***";
return 0;
}
}
if((f==0&&fl==1)||(f==1&&fl==0))
{
cout<<"***";
return 0;
}
if(f==0&&fl==0)
{
for(i=1;i<=26;i++)
{
if(in[i]==out[i]&&in[i]!=0)
{
k=i;
break;
}
}
}
dfs(k,1);
for(i=1;i<=26;i++)
{
for(j=0;j<v[i].size();j++)
{
if(v[i][j]!=0)
{
cout<<"***";
return 0;
}
}
}
for(i=now-1;i>=1;i--)
{
if(i==1) cout<<e[step[i]].wd;
else cout<<e[step[i]].wd<<".";
}
return 0;
}
帮个忙吧,调不动了!!!