大致思路:以单词为边判断是否为欧拉图,再通过dfs找欧拉路
代码:
#include<bits/stdc++.h>
using namespace std;
char a[10005][202],s[10005];
int n,len[10005],num[2000],rd[10005],rd0,ll,cd[10005],oula,t1,t2,ans[10005],cnt;
bool b[300][10005];
struct mp{
int to,word;
}p[300][10005];
void add(int from,int to,int dis)
{
p[from][++num[from]].to=to;
p[from][num[from]].word=dis;
}
void dfs(int x)
{
if(cnt==n)return;
for(int i=1;i<=num[x];i++)
{
if(b[x][i])continue;
b[x][i]=1;
ans[++cnt]=p[x][i].word;
// cout<<cnt<<' '<<x<<' '<<ans[cnt]<<' '<<p[x][i].to<<endl;
dfs(p[x][i].to);
if(cnt==n)return;
ans[cnt--]=0;
b[x][i]=0;
}
if(cnt==n)return;
}
int main()
{
//cout<<(int)'a';
memset(a,0,sizeof(a));
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%s",&a[i]);
for(int i=1;i<=n;i++)
len[i]=strlen(a[i]);
for(int i=1;i<=n;i++)
s[i]=a[i][0];
sort(s+1,s+1+n);
memset(rd,0,sizeof(rd));
memset(cd,0,sizeof(cd));
for(int i=1;i<=n;i++)
add(a[i][0]-96,a[i][len[i]-1]-96,i),
cd[a[i][0]-96]++,rd[a[i][len[i]-1]-96]++;
for(int i=1;i<=26;i++)
{
if(cd[i]!=rd[i])
{
oula++;
if(!t1)t1=i;
else t2=i;
}
//cout<<char(i+96)<<' '<<rd[i]<<' '<<cd[i]<<endl;
}//cout<<oula;
if(oula&&oula!=2)
{
printf("***");
return 0;
}
if(oula==2)
{
int cr1=cd[t1]-rd[t1],cr2=rd[t1]-cd[t1];
if((cr1!=1||cr2!=-1)&&(cr1!=-1&&cr2!=1))
{
printf("***");
return 0;
}
}
for(int i=1;i<=26;i++)
{
for(int j=1;j<=num[i];j++)
{
for(int k=num[i];k>j;k--)
{
int to1=p[i][k].word,len1=len[p[i][k].word];
int to2=p[i][k-1].word,len2=len[p[i][k-1].word];
for(int l=0;l<min(len1,len2);l++)
{
// cout<<a[to1][l]<<' '<<a[to2][l]<<endl;
if(a[to1][l]<a[to2][l])
{
swap(p[i][k],p[i][k-1]);
break;
}
else if(a[to1][l]>a[to2][l])
break;
if(l==min(len1,len2)-1)
if(len1<len2)swap(p[i][k],p[i][k-1]);
}
}
}
// for(int j=1;j<=num[i];j++)
// cout<<i<<' '<<j<<' '<<a[p[i][j].word]<<endl;
}
int t=0;
while(t<26)
{
memset(b,0,sizeof(b));
cnt=0;
dfs(s[++t]-96);
//
if(cnt==n)
{
for(int i=1;i<=cnt;i++)
{
printf("%s",a[ans[i]]);
if(i<cnt)putchar('.');
}
return 0;
}
}
printf("***");
return 0;
}
/*
6
gopher
rat
aloha
arachnid
tiger
dog
5
qw
we
er
rt
tq
3
wer
rty
yhjnr
***
5
ert
tyu
ujh
hgt
tre
*/