给个能出错的数据也行,对拍我拍了好久都没弄出错……
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <algorithm>
#define For(x) for(int h=head[x],vv=v[h]; h; vv=v[h=nxt[h]])
using namespace std;
int n,N;
string a[2005];
struct Tu{
int head[2000],nxt[4000],v[4000],cnt,f[2000],vf[4000],ru[2000],chu[2000];
string s[4000];
void Add(int x,int y,string ss){
cnt++;
nxt[cnt]=head[x];
v[cnt]=y;
s[cnt]=ss;
head[x]=cnt;
}
bool liantong(int x){
if (f[x]) return 1;
f[x]=1;
For(x) if (!liantong(vv)) return 0;
return 1;
}
bool check(){
int S=0,T=0;
for (int i=0; i<26; i++){
if (ru[i]==chu[i]) continue;
if (ru[i]==chu[i]+1){T++; continue;}
if (chu[i]==ru[i]+1){S++; continue;}
return 0;
}
if (S>1 || T>1) return 0;
return 1;
}
void he(int x){
string mn="zzzzzzzzzzzzz";
int mw;
For(x) if (!vf[h]){
if (s[h]<mn){
mw=h;
mn=s[h];
}
}
vf[mw]=1;
N++;
cout <<s[mw];
if (N<n) cout <<".";
if (N==n) return;
he(v[mw]);
}
}A,B;
int main(){
cin >>n;
for (int i=1; i<=n; i++) cin >>a[i];
sort(a+1,a+n+1);
for (int i=n,uuu,vvv; i; i--){
uuu=a[i][0]-'a';
vvv=a[i][a[i].length()-1]-'a';
A.Add(uuu,vvv,a[i]);
B.Add(uuu,vvv,a[i]);
B.Add(vvv,uuu,a[i]);
A.ru[vvv]++;
A.chu[uuu]++;
}
for (int i=0; i<26; i++) B.f[i]=0;
if (!B.liantong(0) || !A.check()){
printf("***");
return 0;
}
for (int i=0; i<26; i++) if (A.ru[i]+1==A.chu[i]){
for (int j=1; j<=A.cnt; j++) A.vf[j]=0;
A.he(i);
return 0;
}
for (int i=0; i<26; i++) if (A.ru[i]){
for (int j=1; j<=A.cnt; j++) A.vf[j]=0;
A.he(i);
return 0;
}
}
/*
5
ab
ba
ab
bc
bc
*/