欧拉回路模板题吗!然而27分代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,du[1010],fa[26];
string str[1010];
struct node{
int k,s;
};
vector<node> v[26];
bool t=1,vis[1010],can[1010];
void dfs(int now){
vis[now]=1;
for(int i=0;i<v[now].size();i++){
if(t) t=0;
else printf(".");
cout<<str[v[now][i].s];
if(!vis[v[now][i].k]){
vis[v[now][i].k]=1;
dfs(v[now][i].k);
}
}
}
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
int main(){
scanf("%d",&n);
for(int i=0;i<26;i++) fa[i]=i;
for(int i=1;i<=n;i++) cin>>str[i];
sort(str+1,str+n+1);
for(int i=1;i<=n;i++){
int a=*str[i].begin()-'a',b=*(str[i].end()-1)-'a';
v[a].push_back({b,i});
fa[find(a)]=find(b);
can[a]=can[b]=1;
du[a]++;
du[b]--;
}
int i,first;
for(i=0;i<26;i++){
if(can[i]){
first=fa[i];
break;
}
}
for(i++;i<26;i++){
if(can[i]&&fa[i]!=first){
printf("***");
return 0;
}
}
vector<int> p;
for(int i=0;i<26;i++){
if(du[i]) p.push_back(du[i]);
}
if(p.size()==0){
for(int i=0;i<26;i++){
if(can[i]){
dfs(i);
break;
}
}
}else if(p.size()==2&&(p[0]==1&&p[1]==-1||p[0]==-1&&p[1]==1)){
for(int i=0;i<26;i++){
if(du[i]==1){
dfs(i);
break;
}
}
}else printf("***");
return 0;
}