45分,最后一个点wa,剩下的TLE
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1005
int n;
string zm[MAXN];
vector <string> fl[30];//边
vector <int> fli[30];//对应的字符串
int vis[MAXN];
string sx[MAXN];//储存答案
int sxi=0;
void output(){
if(sxi<n){
cout << "***";
return;
}
for(int i=0;i<n-1;i++){
cout << sx[i] << ".";
}
cout << sx[n-1];
}
void dfs(int k,int ni){
//cout << k << endl;//
if(k>n){
output();
exit(0);
}
if(ni>=0){
int fir=zm[ni][zm[ni].size()-1]-'a';
if(!fl[fir].empty()){
for(int i=0;i<fl[fir].size();i++){
if(vis[fli[fir][i]]==0){
sx[sxi]=fl[fir][i];
sxi++;
//cout << fli[fir][i] << endl;//
vis[fli[fir][i]]=1;
//for(int i=0;i<n;i++)cout << vis[i] << " ";//
//cout << fl[fir][i] << endl;//
dfs(k+1,fli[fir][i]);
sxi--;
vis[fli[fir][i]]=0;
//cout << endl;//
}
}
}
}
}
int main(){
std::ios::sync_with_stdio(false);
cin >> n;
string xc;
int frn[26]={0},lan[26]={0};
for(int i=0;i<n;i++){
cin >> xc;
zm[i]=xc;
fl[xc[0]-'a'].push_back(xc);
fli[xc[0]-'a'].push_back(i);
frn[xc[0]-'a']++;
lan[xc[xc.size()-1]-'a']++;
}//输入
for(int i=0;i<26;i++){
if(!fl[i].empty()){
sort(fl[i].begin(),fl[i].end());
fl[i].erase(unique(fl[i].begin(),fl[i].end()),fl[i].end());
}
}//排序
/*
for(int i=0;i<26;i++){
if(!fl[i].empty()){
for(int j=0;j<fl[i].size();j++)cout << fl[i][j] << " ";
cout << endl;
}
}
*/
int fir,las;
int firn=0,lasn=0;
for(int i=0;i<26;i++){
if(frn[i]==lan[i]+1){
fir=i;
firn++;
}else if(frn[i]==lan[i]-1){
las=i;
lasn++;
}
}
if(firn>1||lasn>1||(firn+lasn==1)){
cout << "***";
return 0;
}
if(firn+lasn==0){
for(int i=0;i<26;i++){
if(!fl[i].empty()){
for(int j=0;j<fl[i].size();j++){
sx[sxi]=fl[i][j];
sxi++;
vis[fli[i][j]]=1;
dfs(2,fli[i][j]);
sxi--;
vis[fli[i][j]]=0;
}
}
}
}else{
for(int i=0;i<fl[fir].size();i++){
sx[sxi]=fl[fir][i];
sxi++;
vis[fli[fir][i]]=1;
dfs(2,fli[fir][i]);
sxi--;
vis[fli[fir][i]]=0;
}
}//初步判断解并dfs
cout << "***";
}