您的位置:首页 > 其它

CF 510C Fox And Names【拓扑排序】

2016-04-04 15:28 681 查看
Fox And Names

Time Limit: 2000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u
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
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);
}
}
}

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