// Fuck t*h's cache' #include "testlib.h" #include #include #include #include const char *NO_SOL = "No Solution!"; const int MAXN = 103; int n, v; std::string city[MAXN]; std::map id; bool g[MAXN][MAXN] = {{ false }}; int route[MAXN]; bool vis[MAXN]; typedef std::tuple answer_t; answer_t read_answer(InStream &ouf) { std::string m_str = ouf.readLine(); int m = -1; if (m_str == NO_SOL) return answer_t(-1, _ok, "" ); m = strtol(m_str.c_str(), NULL, 10) + 1; for (int i = 0; i < m; ++i) { std::string s = ouf.readToken(); std::map::iterator p = id.find(s); if (p == id.end()) { return answer_t(m, _wa, "Nonexistent city name " + s); } route[i] = p->second; } for (int i = 0; i < n; ++i) vis[i] = false; int phase = 0; for (int i = 0; i < m; ++i) { if (vis[route[i]]) { return answer_t(m, _wa, "Non-westernmost city " + city[route[i]] + " should not be visited more than once"); } vis[route[i]] = true; if (i == 0) { if (route[i] != 0) { return answer_t(m, _wa, "First city should be the westernmost one " + city[0]); } vis[route[i]] = false; // Will be visited twice } else { if (!g[route[i - 1]][route[i]]) { return answer_t(m, _wa, "Nonexistent flight " + city[route[i - 1]] + "-" + city[route[i]]); } else if ((phase == 0) ^ (route[i] > route[i - 1])) { return answer_t(m, _wa, "Incorrect direction " + city[route[i - 1]] + "-" + city[route[i]]); } if (route[i] == n - 1) phase = 1; } } if (phase == 0) { return answer_t(m, _wa, "Didn't reach the easternmost city " + city[n - 1]); } if (route[m - 1] != 0) { return answer_t(m, _wa, "Last city should be the westernmost one " + city[0]); } return answer_t(m, _ok, ""); } int main(int argc, char *argv[]) { registerTestlibCmd(argc, argv); n = inf.readInt(); v = inf.readInt(); for (int i = 0; i < n; ++i) { city[i] = inf.readToken(); id[city[i]] = i; } for (int i = 0; i < v; ++i) { std::string s = inf.readToken(); std::string t = inf.readToken(); g[id[s]][id[t]] = g[id[t]][id[s]] = true; } auto jury_ans = read_answer(ans); auto ptcp_ans = read_answer(ouf); if (std::get<1>(jury_ans) != _ok) { quitf(_fail, "Jury's answer is invalid: %s", std::get<2>(jury_ans).c_str()); } if (std::get<1>(ptcp_ans) != _ok) { quitf(std::get<1>(ptcp_ans), "Invalid: %s", std::get<2>(ptcp_ans).c_str()); } if (std::get<0>(jury_ans) > std::get<0>(ptcp_ans)) { quitf(_wa, "Participant's answer is suboptimal"); } else if (std::get<0>(jury_ans) < std::get<0>(ptcp_ans)) { quitf(_fail, "Jury's answer is suboptimal! O O"); } quitf(_ok, "*\\(^ ^)/*"); return 0; }