CF 510C Fox And Names【拓扑排序】
2016-04-04 15:28
681 查看
Fox And Names
Submit Status
Description
Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce: "Fox"). She heard a rumor: the authors list on the paper is always sorted in the lexicographical order.
After checking some examples, she found out that sometimes it wasn't true. On some papers authors' names weren't sorted in lexicographicalorder in normal sense. But it was always true that after some modification of
the order of letters in alphabet, the order of authors becomeslexicographical!
She wants to know, if there exists an order of letters in Latin alphabet such that the names on the paper she is submitting are following in thelexicographical order. If so, you should find out any such order.
Lexicographical order is defined in following way. When we compare s and t, first we
find the leftmost position with differing characters: si ≠ ti. If there is no such position (i. e. s is
a prefix of t or vice versa) the shortest string is less. Otherwise, we compare characters si and tiaccording
to their order in alphabet.
Input
The first line contains an integer n (1 ≤ n ≤ 100): number of names.
Each of the following n lines contain one string namei (1 ≤ |namei| ≤ 100),
the i-th name. Each name contains only lowercase Latin letters. All names are different.
Output
If there exists such order of letters that the given names are sorted lexicographically, output any such order as a permutation of characters 'a'–'z' (i. e. first output the first letter of the modified alphabet, then the second, and so on).
Otherwise output a single word "Impossible" (without quotes).
Sample Input
Input
Output
Input
Output
Input
Output
Input
Output
Source
Codeforces Round #290 (Div. 2)
132453124
原来拓扑排序这么简单
代码如下
Time Limit: 2000MS | Memory Limit: 262144KB | 64bit IO Format: %I64d & %I64u |
Description
Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce: "Fox"). She heard a rumor: the authors list on the paper is always sorted in the lexicographical order.
After checking some examples, she found out that sometimes it wasn't true. On some papers authors' names weren't sorted in lexicographicalorder in normal sense. But it was always true that after some modification of
the order of letters in alphabet, the order of authors becomeslexicographical!
She wants to know, if there exists an order of letters in Latin alphabet such that the names on the paper she is submitting are following in thelexicographical order. If so, you should find out any such order.
Lexicographical order is defined in following way. When we compare s and t, first we
find the leftmost position with differing characters: si ≠ ti. If there is no such position (i. e. s is
a prefix of t or vice versa) the shortest string is less. Otherwise, we compare characters si and tiaccording
to their order in alphabet.
Input
The first line contains an integer n (1 ≤ n ≤ 100): number of names.
Each of the following n lines contain one string namei (1 ≤ |namei| ≤ 100),
the i-th name. Each name contains only lowercase Latin letters. All names are different.
Output
If there exists such order of letters that the given names are sorted lexicographically, output any such order as a permutation of characters 'a'–'z' (i. e. first output the first letter of the modified alphabet, then the second, and so on).
Otherwise output a single word "Impossible" (without quotes).
Sample Input
Input
3 rivest shamir adleman
Output
bcdefghijklmnopqrsatuvwxyz
Input
10 tourist petr wjmzbmr yeputons vepifanov scottwu oooooooooooooooo subscriber rowdark tankengineer
Output
Impossible
Input
10 petr egor endagorion feferivan ilovetanyaromanova kostka dmitriyh maratsnowbear bredorjaguarturnik cgyforever
Output
aghjlnopefikdmbcqrstuvwxyz
Input
7 car care careful carefully becarefuldontforgetsomething otherwiseyouwillbehacked goodluck
Output
acbdefhijklmnogpqrstuvwxyz
Source
Codeforces Round #290 (Div. 2)
132453124
原来拓扑排序这么简单
代码如下
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
char s[110][110];
int ans[50];//最终存在这里
int in[30];//入度
int size;
int link[30][30];
queue<int>q;
int topo()//拓扑排序判断是否存在可行解
{
int i;
for(i=0; i<26; i++)
{
if(in[i]==0)
{
q.push(i);//入度为0的放进去
ans[size++]=i+'a';
}
}
while(!q.empty())
{
int num=q.front();
q.pop();
for(i=0; i<26; i++)
{
if(link[num][i]==1)
{
in[i]--;
if(in[i]==0)
{
q.push(i);
ans[size++]=i+'a';
}
}
}
}
ans[26]='\0';
if(size<26)//小于26即存在环
return 0;
}
int main()
{
int n,bj,i,j;
while(~scanf("%d",&n))
{
bj=1;
for(i=0; i<n; i++)
scanf("%s",s[i]);
memset(in,0,sizeof(in));
memset(link,0,sizeof(link));
for(i=0; i<n-1; i++)
{
int len1=strlen(s[i]);
int len2=strlen(s[i+1]);
for(j=0; j<len1&&j<len2&&s[i][j]==s[i+1][j]; j++);
if(j<len1&&j<len2)
{
if(link[s[i][j]-'a'][s[i+1][j]-'a']==0)
{
in[s[i+1][j]-'a']++;
link[s[i][j]-'a'][s[i+1][j]-'a']=1;
}
}
else if(len1>len2)//如果一个字符串是另一个的前缀,并且长的排在前面,则Impossiblebj=0;
}
if(bj==0)
printf("Impossible\n");
else
{
size=0;
bj=topo();
if(bj==0)
printf("Impossible\n");
else
printf("%s\n",ans);
}
}
}
相关文章推荐
- 【java集合框架源码剖析系列】java源码剖析之TreeSet
- 苦瓜降火
- 个人向LaTex总结
- 【java集合框架源码剖析系列】java源码剖析之TreeSet
- 阿里、腾讯、京东、微软,各家算法&数据挖掘岗位面经大起底!
- 深度学习十大顶级框架
- 追加样式表操作
- 常量指针与指针常量的区别(转载)
- 纯虚函数
- 自定义通知栏布局
- 初识redis
- 机器学习大数据数据挖掘推荐系统相关资源
- 优先队列 + 并查集 + 字典树 + 欧拉回路 + 树状数组 + 线段树 + 线段树点更新 + KMP +AC自动机 + 扫描线
- IT 团队管理
- java对象内存理解
- 【HDU 1396】 【ZOJ 1629】 Counting Triangles
- Ubuntu连接互联网
- 什么是指针?
- 机器学习&深度学习资料
- 前端开发跨浏览器计算页面大小、滚动高度