题意:给定n个字符串,问能不能求出一个字母表使得字符串满足字母表上面的字典序
思路:拓扑排序,但是这个题目的坑有点多 比较坑的就是aa a这种情况是错误的 因为aa的字典序明显比a要大
<pre name="code" class="cpp">#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int Map[27][27];
int indegree[100];
char voc[105][105];
char ans[105];
void topo()
{
int cnt=0;
int top=0;
for(int i=0;i<26;i++)
{
for(int j=0;j<26;j++)
{
if(indegree[j]==0)
{
indegree[j]--;
ans[cnt++]=j+'a';
for(int k=0;k<26;k++)
{
if(Map[j][k])
{
Map[j][k]=0;
indegree[k]--;
}
}
break;
}
}
}
printf("%s\n",ans);
}
int main()
{
int n;
scanf("%d",&n);
memset(indegree,0,sizeof(indegree));
memset(Map,0,sizeof(Map));
for(int i=1;i<=n;i++)
{
scanf("%s",voc[i]);
}
int flag;
int vis=1;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
flag=0;
int leni=strlen(voc[i]);
int lenj=strlen(voc[j]);
for(int k=0;k<min(leni,lenj);k++)
{
if(voc[i][k]!=voc[j][k])
{
flag=1;
if(Map[voc[i][k]-'a'][voc[j][k]-'a']==0)
{
Map[voc[i][k]-'a'][voc[j][k]-'a']=1;
indegree[voc[j][k]-'a']++;
}
break;
}
}
if(!flag&&leni>lenj)
{
vis=0;
}
}
}
for(int k=0;k<26;k++)
{
for(int i=0;i<26;i++)
{
for(int j=0;j<26;j++)
{
if(Map[i][k]&&Map[k][j]&&!Map[i][j])
{
Map[i][j]=1;
indegree[j]++;
}
}
}
}
for(int i=0;i<26;i++)
{
for(int j=0;j<26;j++)
{
if(Map[i][j]&&Map[j][i]||vis==0)
{
printf("Impossible\n");
return 0;
}
}
}
topo();
return 0;
}