#include<cstdio>
#include<cstring>
#define MIN(x,y) ((x)>(y)?(y):(x))
int m[30][30],d[30],vis[30];
char str[1050][260];
int floyd()//判断是否有回路
{
int d[30][30];
for(int i=0;i<30;i++)
for(int j=0;j<30;j++)
d[i][j]=m[i][j];
for(int k=0;k<30;k++)
for(int i=0;i<30;i++)
for(int j=0;j<30;j++)
d[i][j]|=d[i][k]&d[k][j];
for(int i=0;i<30;i++)
if(d[i][i])
return 0;
return 1;
}
int main()
{
int n,symbol=0;
memset(m,0,sizeof(m));
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",str[i]);
for(int i=0;i<n-1;i++)
{
int len1=strlen(str[i]);
int len2=strlen(str[i+1]);
int flag=0;
for(int j=0;j<MIN(len1,len2);j++)
{
if(str[i][j]==str[i+1][j])
continue;
m[str[i][j]-'a'][str[i+1][j]-'a']=1;
flag=1;
break;
}
if(!flag&&len1>len2)
{
symbol=1;
break;
}
}
if(symbol||!floyd())
printf("-1\n");
else
{
for(int i=0;i<26;i++)
for(int j=0;j<26;j++)
if(m[i][j])
d[j]++;
while(1)
{
int flag=0;
for(int i=0;i<26;i++)
{
if(!vis[i]&&d[i]==0)
{
flag=1;
vis[i]=1;
printf("%c",i+'a');
for(int j=0;j<26;j++)
if(m[i][j])
{
m[i][j]=0;
d[j]--;
}
break;
}
}
if(!flag)
break;
}
printf("\n");
}
}
欧拉回路
最新推荐文章于 2020-01-26 17:48:55 发布