1. 程式人生 > >CodeForces 510C Fox And Names (拓撲排序)

CodeForces 510C Fox And Names (拓撲排序)

define codeforce for topo spa inline color std 尋找

<題目鏈接>

題目大意:

給你一些只由小寫字母組成的字符串,現在按一定順序給出這些字符串,問你怎樣從重排字典序,使得這些字符串按字典序排序後的順序如題目所給的順序相同。

解題分析:
本題想到拓撲排序就好做了。就是枚舉每個字符串,每個字符串和它前一個字符串尋找第一個不同的字符,然後前一個串的該字符向當前串的字符連一條有向邊(註意判斷後一個串是前一個串的子串的情況)。然後就是跑一遍拓撲排序,如果不沖突的話,就可構造出答案。

#include <bits/stdc++.h>
using namespace std;

#define pb push_back
string
str[110]; vector<int>G[30]; int ind[30]; vector<int>ans; inline void TopoSort(){ queue<int>q; for(int i=0;i<26;i++){ if(!ind[i])q.push(i); } while(q.size()){ int u=q.front();q.pop(); ans.pb(u); ind[u]=-1; for
(int i=0;i<G[u].size();i++){ int v=G[u][i]; //得到它的子節點 ind[v]--; if(ind[v]==0)q.push(v); } } } int main(){ int n;cin>>n; for(int i=1;i<=n;i++) cin>>str[i]; for(int i=2;i<=n;i++){ //枚舉字符串 int len1=str[i-1
].size(); int len2=str[i].size(); bool fp=false; for(int j=0;j<min(len1,len2);j++){ if(str[i-1][j]!=str[i][j]){ int u=str[i-1][j]-a; int v=str[i][j]-a; G[u].pb(v); ind[v]++; //記錄這個點的入度 fp=true; break; }//找到第一個不同的元素 } if(!fp&&len1>len2)return puts("Impossible"),0; //如果當前串是前一個串的子串 } TopoSort(); if(ans.size()<26)puts("Impossible"); else { for(int i=0;i<ans.size();i++) printf("%c",ans[i]+a); puts(""); } }

CodeForces 510C Fox And Names (拓撲排序)