WA #2 too short on line 1
#include<iostream>
#include<cstdio>
#include<cmath>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define maxn 1010
#define inf 0x7f7f7f7f
#define mod 1000000007
#define int long long
#define re register
inline int read();
inline void wn(int x);
inline void wr(int x);
inline void wi(int x);
int n;
string a[maxn];
int rd[maxn],cd[maxn];
struct node
{
int s,t,nex,v;
}edge[maxn];
int head[maxn],cnt;
void add(int s,int t)
{
cd[s]++;
rd[t]++;
edge[++cnt].s=s;
edge[cnt].t=t;
edge[cnt].nex=head[s];
head[s]=cnt;
}
bool del[maxn];
bool vis[maxn];
int ss[maxn],top;
void kkk(int x)
{
vis[x]=true;
for(re int i=head[x];i;i=edge[i].nex)
{
int tt=edge[i].t;
if(!vis[tt]) kkk(tt);
}
}
void dfs(int x)
{
for(re int i=head[x];i;i=edge[i].nex)
{
if(del[i]) continue;
int tt=edge[i].t;
del[i]=true;
dfs(tt);
ss[++top]=i;
}
}
void out()
{
while(top>1) cout<<a[ss[top--]]<<'.';
cout<<a[ss[top--]];
}
bool cmp(string a,string b)
{
return a>b;
}
signed main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
// printf("%d M\n",((sizeof(z))>>20));
cin>>n;
for(re int i=1;i<=n;++i) cin>>a[i];
sort(a+1,a+n+1,cmp);
for(re int i=1;i<=n;++i)
add(a[i][0]-'a'+1,a[i][a[i].size()-1]-'a'+1);
for(re int i=1;i<=26;++i)
if(cd[i])
{
kkk(i);
break;
}
for(re int i=1;i<=26;++i)
if((cd[i]||rd[i])&&!vis[i])
{
puts("***");
return 0;
}
int s=1,amo=0,amo1=0,amo2=0;
int tot=0;
for(re int i=1;i<=26;++i)
if(cd[i]||rd[i]) tot++;
for(re int i=1;i<=26;++i)
{
if(!cd[i]&&!rd[i]) continue;
if(cd[i]-rd[i]==1)
amo1++;
if(cd[i]-rd[i]==-1)
amo2++;
if(cd[i]-rd[i]==0)
amo++;
}
// wr(tot);
// wi(amo1),wi(amo2),wr(amo);
if(amo+amo1+amo2!=tot)
{
puts("***");
return 0;
}
if(amo==tot)
{
dfs(1);
out();
}
else
{
// if(amo1==1&&amo2==1)
// {
int s=1;
for(re int i=1;i<=26;++i)
if(cd[i]-rd[i]==1) s=i;
dfs(s);
out();
// }
}
return 0;
}
//==========================================================
inline int read()
{
int f=1,x=0;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<3)+(x<<1)+ch-'0';
ch=getchar();
}
return x*f;
}
inline void wn(int x)
{
if(x<0)
{
putchar('-');
wn(-x);
return ;
}
if(x>=10) wn(x/10);
putchar('0'+x%10);
}
inline void wr(int x)
{
wn(x);
putchar('\n');
}
inline void wi(int x)
{
wn(x);
putchar(' ');
}