谢谢点进来 debug。 RT
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF=2005;
int n,num[111],_sub[111][INF],len[INF],fa_set[INF],in[INF],last[INF];
string ch[INF],ans[INF]; bool vis[INF],flag,vis1[INF];
int find_set(int xx) {
return xx==fa_set[xx] ? xx : fa_set[xx]=find_set(fa_set[xx]);
}
void DFS(int x,int sum) {
// cout<<x<<" "<<sum<<" "<<last[x]<<" "<<num[x]<<"\n";
if (flag) return;
if (sum==n) {flag=true; return;}
for (int i=last[x]; i<=num[x]; i++) {
if (vis1[_sub[x][i]]) continue; vis1[_sub[x][i]]=true;
ans[sum+1]=ch[_sub[x][i]]; last[x]=i+1;
DFS(ch[_sub[x][i]][len[_sub[x][i]]-1]-'a',sum+1);
if (flag) return;
}
return;
}
signed main()
{
ios::sync_with_stdio(false);
cin>>n;
for (int i=0; i<26; i++) fa_set[i]=i,last[i]=1;
for (int i=1; i<=n; i++) {
cin>>ch[i];
len[i]=ch[i].size();
in[ch[i][0]-'a']++;
in[ch[i][len[i]-1]-'a']++;
vis[ch[i][0]-'a']=true;
fa_set[find_set(ch[i][0]-'a')]=find_set(ch[i][len[i]-1]-'a');
}
sort(ch+1,ch+1+n);
for (int i=1; i<=n; i++) _sub[ch[i][0]-'a'][++num[ch[i][0]-'a']]=i;
int cnt=0,Min=1e9;
for (int i=0; i<26; i++) {
if (in[i]&1) {
cnt++;
Min=min(Min,i);
}
}
if (cnt==1 || cnt>2) {cout<<"***\n"; return 0;}
int fa=-1;
for (int i=1; i<=n; i++) {
if (!vis[ch[i][0]-'a']) continue;
if (fa!=-1 && fa!=find_set(ch[i][0]-'a')) {cout<<"***\n"; return 0;}
else fa=find_set(ch[i][0]-'a');
}
for (int i=0; i<26; i++)
if (vis[i]) {
// cout<<i<<"\n";
DFS(i,0);
if (flag) break;
for (int j=0; j<26; j++) last[j]=1;
for (int j=1; j<=n; j++) vis1[j]=0;
}
// if (!flag) {cout<<"***\n"; return 0;}
for (int i=1; i<=n; i++) if (i!=n) cout<<ans[i]<<"."; else cout<<ans[i];
return 0;
}