sb题。直接建出大小关系然后拓扑。
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=105,maxe=105;
int n,m,len[maxn],d[maxn],res[maxn];
int fir[maxn],nxt[maxe],son[maxe],tot;
char st[105][105];
void add(int x,int y){
son[++tot]=y; nxt[tot]=fir[x]; fir[x]=tot;
d[y]++;
}
queue<int> Q;
int main(){
// freopen("cf510C.in","r",stdin);
// freopen("cf510C.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%s",st[i]+1), len[i]=strlen(st[i]+1);
for(int i=1;i<=n-1;i++){
bool pd=false;
for(int j=1;j<=len[i]&&j<=len[i+1]&&!pd;j++)
if(st[i][j]!=st[i+1][j]) pd=true, add(st[i][j]-'a'+1,st[i+1][j]-'a'+1);
if(!pd&&len[i]>len[i+1]) return puts("Impossible\n"), 0;
}
for(int i=1;i<=26;i++) if(!d[i]) Q.push(i);
while(!Q.empty()){
int x=Q.front(); Q.pop();
res[++res[0]]=x;
for(int j=fir[x];j;j=nxt[j]) if((--d[son[j]])==0) Q.push(son[j]);
}
if(res[0]<26) puts("Impossible\n"); else{
for(int i=1;i<=26;i++) putchar('a'-1+res[i]);
}
return 0;
}