翻译:
Fox Ciel将发表一篇关于FOCS (Fox操作的计算机系统,发音:“Fox”)的论文。她听到一个谣言:报纸上的作者名单总是按照词典顺序排列的。
在查看了一些例子后,她发现有时这不是真的。在一些论文中,作者的名字没有按照正常意义上的词典顺序排序。但是,在对字母表中字母的顺序进行了一些修改之后,作者的顺序就变成了字典编纂者的顺序。
她想知道,在拉丁字母表中是否存在一种字母顺序,使得她提交的论文上的名字是按照字典顺序排列的。如果是这样,你应该找到任何这样的订单。
字典顺序的定义如下。当我们比较s和t时,首先我们找到最左边的位置具有不同的字符:si≠ti。如果没有这样的位置(即s是t的前缀,反之亦然),则最短的字符串更小。否则,我们比较字符si和ti根据它们在字母表中的顺序。
输入
第一行为整数n(1≤n≤100):名称个数。
下面n行的每一行都包含一个字符串namei(1≤|namei|≤100),即第i个名称。每个名字只包含小写的拉丁字母。所有的名字都不一样。
输出
如果存在这样的字母顺序,给定的名字是按字典顺序排列的,输出任何这样的顺序作为字符'a' - 'z'的排列(即首先输出修改后的字母表的第一个字母,然后输出第二个字母,依此类推)。
否则输出一个单词“Impossible”(不带引号)。
例子
inputCopy
3.
里维斯特
沙密
期刊
outputCopy
bcdefghijklmnopqrsatuvwxyz
inputCopy
10
旅游
切赫
wjmzbmr
yeputons
vepifanov
scottwu
oooooooooooooooo
订阅者
rowdark
tankengineer
outputCopy
不可能的
inputCopy
10
切赫
egor
endagorion
feferivan
ilovetanyaromanova
kostka
dmitriyh
maratsnowbear
bredorjaguarturnik
cgyforever
outputCopy
aghjlnopefikdmbcqrstuvwxyz
inputCopy
7
车
护理
小心
小心翼翼地
becarefuldontforgetsomething
otherwiseyouwillbehacked
古德勒克
outputCopy
acbdefhijklmnogpqrstuvwxyz
思路:
因为每个人名字都是字典序排序,所以我们用这个可以来每次确定两个字母的关系,然后二维数组标记,之后dfs,如果有两个相同的字母相互前后标记,那么就是不可能,可能的话就用字典树来记录一下。
代码:
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<tuple>
#include<numeric>
using namespace::std;
typedef long long ll;
inline __int128 read(){
__int128 x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
inline void print(__int128 x){
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9)
print(x / 10);
putchar(x % 10 + '0');
}
int n;
int tree[27][27];
int bj[27];
string a,b,ss;
int lls=0;
void dfs(int x){
if (lls==1) {
return;
}
bj[x]=1;
for (int i =0; i<27; i++) {
if (lls==1) {
return;
}
if (tree[x][i]) {
if (bj[i]==1) {
cout<<"Impossible\n";
lls=1;return;
}
if (bj[i]!=2) {
dfs(i);
if (lls==1) {
return;
}
}
}
}
bj[x]=2;
if (x+'a'<='z') {
ss+=(x+'a');
}
// cout<<ss<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(); cout.tie();
ss="";
cin>>n;
cin>>a;
// cout<<a<<endl;
for (int i =1; i<n; i++) {
bool kl=false;
cin>>b;
// cout<<b<<endl;
for (int j = 0; j<min(a.size(),b.size()); j++) {
if (a[j]!=b[j]) {
tree[b[j]-'a'][a[j]-'a']=1;
kl=true;
break;
}
}
if (!kl&&a.size()>b.size()) {
cout<<"Impossible\n";
return 0;
}
a=b;
}
for (int i = 0; i<27; i++) {
if (bj[i]!=2) {
dfs(i);
if (lls) {
return 0;
}
}
}
cout<<ss<<"\n";
return 0;
}