cf 510c Fox And Names 拓扑排序
题意: n(100)个字符串长度不超过100,按照题目给出的顺序能否重新定义一下字典序。如果可以输出这26个字母
思路:拓扑排序
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define forn(i,n) for(int i=0;i<n;i++)
#define for1(i,n) for(int i=1;i<=n;i++)
#define IO ios::sync_with_stdio(false);cin.tie(0)
string s[105];
vector<int>e[27];
bool vis[27];
int in[27];
void tpo(){
queue<int>q;
vector<int>ans;
forn(i,26) if(!in[i]) q.push(i);
bool ok = 1;
while(!q.empty()){
auto u = q.front();q.pop();
if(vis[u]) {
ok = 0;
break;
}
vis[u] = 1;
ans.push_back(u);
for(auto &v:e[u]){
if(!--in[v]) q.push(v);
}
}
if(!ok||ans.size()!=26){
//cerr<<"@!#@!#@#! "<<ok<<' '<<ans.size()<<'
';
cout<<"Impossible"<<'
';
return;
}
for(auto &x:ans) cout<<char(x+'a');
}
int main(){
IO;
int n;cin>>n;
map<pair<int,int>,int>mp;
forn(i,n) cin>>s[i];
for1(i,n-1){
int u = -1,v = -1;
forn(j,s[i-1].size()){
if(j>=s[i].size()) return cout<<"Impossible"<<'
',0;
if(s[i-1][j]!=s[i][j]){
u = s[i-1][j]-'a',v = s[i][j]-'a';
break;
}
}
if(u!=-1) {
if(!mp.count({u,v})){
mp[{u,v}] = 1;
e[u].push_back(v);
in[v]++;
}
}
}
tpo();
return 0;
}