这个题就是求欧拉路,主要就是判断能否构成欧拉同路,然后DFS一下就行了~
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn=1100;
struct Node
{
char s[30];
int len;
bool operator < (const Node &a)const
{
return strcmp(s,a.s)<0;
}
}a[maxn];
struct Edge
{
int u;
int v;
bool is;
}e[maxn];
int n,st,p[maxn],in[maxn],out[maxn];
stack<int> s;
bool vis[30];
int find(int x)
{
if(p[x]==-1)
return x;
return p[x]=find(p[x]);
}
void DFS(int x)
{
for(int i=0;i<n;i++)
if(!e[i].is&&e[i].u==x)
{
e[i].is=true;
DFS(e[i].v);
s.push(i);
}
}
bool Is()
{
int cnt=0;
for(int i=0;i<26;i++)
if(vis[i]&&p[i]==-1)
cnt++;
return cnt==1;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(p,-1,sizeof(p));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
scanf("%s",a[i].s);
a[i].len=strlen(a[i].s);
}
sort(a,a+n);
for(int i=0;i<n;i++)
{
int u=a[i].s[0]-'a';
int v=a[i].s[a[i].len-1]-'a';
vis[u]=vis[v]=1;
e[i].u=u;
e[i].v=v;
e[i].is=false;
in[u]++;
out[v]++;
u=find(u);
v=find(v);
if(u!=v)
p[v]=u;
}
int st=e[0].u,cnta=0,cntb=0;
bool is=true;
for(int i=0;i<26;i++)
{
if(in[i]==out[i])
continue;
else if(in[i]==out[i]+1)
{
st=i;
cnta++;
}
else if(in[i]==out[i]-1)
cntb++;
else
{
is=false;
break;
}
}
if(is&&(cnta==cntb&&(cnta==1||cnta==0))&&Is())
{
DFS(st);
printf("%s",a[s.top()].s);
s.pop();
while(!s.empty())
{
printf(".%s",a[s.top()].s);
s.pop();
}
printf("\n");
}
else
printf("***\n");
}
return 0;
}