【分析】
這一道其實沒什麼好講的,還是比較裸的拓撲排序。
【代碼】
#define M 255
class NetworkXMessageRecovery {
public:
int mp[M][M];
int in[M],mk[M],have[M];
string ans;
bool chk(int x){
return !in[x]&&!mk[x]&&have[x];
}
void dfs(int s){
mk[s]=1;
ans+=(char)s;
for(int i='A';i<='Z';i++){
if(mp[s][i])in[i]--;
}
for(int i='a';i<='z';i++){
if(mp[s][i])in[i]--;
}
for(int i='A';i<='Z';i++){
if(chk(i))dfs(i);
}
for(int i='a';i<='z';i++){
if(chk(i))dfs(i);
}
}
string recover(vector<string>st){
int n=st.size();
ans="";
memset(mp,0,sizeof(mp));
memset(in,0,sizeof(in));
memset(mk,0,sizeof(mk));
memset(have,0,sizeof(have));
for(int i=0;i<n;i++){
have[(int)st[i][0]]=1;
for(int j=1;j<=st[i].length();j++){
if(!mp[(int)st[i][j-1]][(int)st[i][j]]){
mp[(int)st[i][j-1]][(int)st[i][j]]=1;
in[(int)st[i][j]]++;
have[(int)st[i][j]]=1;
}
}
}
for(int i='A';i<='Z';i++){
if(chk(i))dfs(i);//沒有前驅,沒有被標記,並且出現過。
}
for(int i='a';i<='z';i++){
if(chk(i))dfs(i);
}
return ans;
}
};