您的位置:首页 > 其它

[CodeForces] 510 C Fox And Names [拓扑排序]

2016-03-18 23:48 459 查看
题意:给定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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: