提交时间:2026-01-19 20:31:27
运行 ID: 83025
#include <iostream> #include <vector> #include <string> #include <unordered_map> #include <sstream> #include <algorithm> using namespace std; // 存储证词的结构体 struct Testimony { string speaker; // 说话者 string type; // 证词类型:guilty_self/not_guilty_self/guilty_other/not_guilty_other/none string target; // 涉及的目标(如XXX is guilty中的XXX) }; int main() { int M, N, P; cin >> M >> N >> P; cin.ignore(); // 忽略换行符 // 存储所有同学的名字,以及名字到索引的映射(方便查找) vector<string> names(M); unordered_map<string, int> name2idx; for (int i = 0; i < M; ++i) { getline(cin, names[i]); name2idx[names[i]] = i; } // 解析所有证词 vector<Testimony> testimonies; for (int i = 0; i < P; ++i) { string line; getline(cin, line); // 分割说话者和证词内容(按": "分割) size_t colon_pos = line.find(": "); if (colon_pos == string::npos) continue; // 格式错误,跳过(题目保证输入合法) string speaker = line.substr(0, colon_pos); string content = line.substr(colon_pos + 2); Testimony t; t.speaker = speaker; t.type = "none"; t.target = ""; // 解析证词内容 if (content == "I am guilty.") { t.type = "guilty_self"; } else if (content == "I am not guilty.") { t.type = "not_guilty_self"; } else if (content.find(" is guilty.") != string::npos) { // 格式:XXX is guilty. size_t guilty_pos = content.find(" is guilty."); t.target = content.substr(0, guilty_pos); t.type = "guilty_other"; } else if (content.find(" is not guilty.") != string::npos) { // 格式:XXX is not guilty. size_t not_guilty_pos = content.find(" is not guilty."); t.target = content.substr(0, not_guilty_pos); t.type = "not_guilty_other"; } // 其他内容(如Today is Sunday/How are you)类型为none,不处理 testimonies.push_back(t); } // 枚举每个同学作为嫌疑人,验证是否符合条件 vector<string> candidates; // 符合条件的嫌疑人 for (string suspect : names) { // 统计每个说话者的说谎次数(只要有一句假话,该人就是说谎者) unordered_map<string, bool> is_liar; // 标记某人是否说谎 for (Testimony t : testimonies) { if (t.type == "none") continue; // 无意义的证词,跳过 bool is_true = false; if (t.type == "guilty_self") { // "I am guilty." → 说话者是否是嫌疑人 is_true = (t.speaker == suspect); } else if (t.type == "not_guilty_self") { // "I am not guilty." → 说话者是否不是嫌疑人 is_true = (t.speaker != suspect); } else if (t.type == "guilty_other") { // "XXX is guilty." → XXX是否是嫌疑人 is_true = (t.target == suspect); } else if (t.type == "not_guilty_other") { // "XXX is not guilty." → XXX是否不是嫌疑人 is_true = (t.target != suspect); } // 如果证词为假,标记该说话者为说谎者 if (!is_true) { is_liar[t.speaker] = true; } } // 统计说谎者的人数 int liar_count = 0; for (auto& p : is_liar) { if (p.second) liar_count++; } // 验证:恰好N人说谎,且说谎者人数≤M(防错) if (liar_count == N) { candidates.push_back(suspect); } } // 根据候选人数输出结果 if (candidates.empty()) { cout << "Impossible" << endl; } else if (candidates.size() == 1) { cout << candidates[0] << endl; } else { cout << "Cannot Determine" << endl; } return 0; }