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()<<'\n';
        cout<<"Impossible"<<'\n';
        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"<<'\n',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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章