题目来源
题目描述
题目解析
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <functional>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <map>
#include <random>
#include <ctime>
#include <iterator>
using namespace std;
void infect(std::map<std::string, std::set<std::string>> &map,
std::set<std::string> &allFail,
std::string &failNode){
allFail.insert(failNode);
for(auto depend : map[failNode]){
if(allFail.count(depend) == 0){
infect(map, allFail, depend);
}
}
}
std::vector<std::string> split(std::string str, char match){
str += match;
std::vector<std::string> ans;
int j = 0;
for (int i = 0; i < str.size(); ++i) {
if(str[i] == match){
ans.push_back( str.substr(j, i - j));
j = i + 1;
}
}
return ans;
}
int main(){
std::string str;
std::cin >> str;
std::string failStr;
std::cin >> failStr;
std::map<std::string, std::set<std::string>> dependMap;
// 依赖关系列表中出现的次序排序
std::vector<std::string> inorderVec;
auto vec = split(str, ',');
for(auto &v : vec){
auto t = split(v, '-');
dependMap[t[1]].insert(t[0]);
inorderVec.emplace_back(t[0]);
inorderVec.emplace_back(t[1]);
}
std::vector<std::string> failNode;
auto failTmp = split(failStr, ',');
for(auto &v : failTmp){
failNode.emplace_back(v);
}
std::set<std::string> allFail;
for(auto f : failNode){
infect(dependMap, allFail, f);
}
std::string ans;
for (int i = 0; i < inorderVec.size(); ++i) {
if(allFail.count(inorderVec[i]) == 0){
ans = ans.empty() ? inorderVec[i] : ans + "," + inorderVec[i];
}
}
std::cout << ans;
}