题目链接
题意:要你构造一个字典序,能够满足给出的字符串是按你给的字典序来排序的。
思路:只要比较一下两个字符串第一个不同的位置,给他们设置一个优先级就行了,有序,优先级?就会想到拓扑排序,于是乎可以考虑建边,那么不成立的时候就是出现环的时候。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e3+1;
int n,ru[maxn];
vector<int>g[maxn];
char s[maxn][maxn],ans[maxn];
bool tuopu()
{
int cnt=0;
queue<int>q;
for(int i=0;i<26;++i)
if(ru[i]==0) q.push(i);
while(!q.empty())
{
int t=q.front();
q.pop();
ans[cnt++]=t+'a';
for(int to:g[t])
{
ru[to]--;
if(ru[to]==0) q.push(to);
}
}
return cnt>=26;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) cin>>s[i];
for(int i=1;i<n;++i)
{
int len1=strlen(s[i]),len2=strlen(s[i+1]),flag=0;
for(int j=0;j<min(len1,len2);++j)
{
if(s[i][j]!=s[i+1][j]) {g[s[i][j]-'a'].push_back(s[i+1][j]-'a'),ru[s[i+1][j]-'a']++,flag=1;break;}
}
if(!flag&&len1>len2) {
puts("Impossible");return 0;
}
}
if(!tuopu()) {
puts("Impossible");return 0;
}
for(int i=0;i<26;++i) printf("%c",ans[i]);
}