2 条题解

  • 0
    @ 2026-8-31 0:15:45
    #include <iostream>
    #include <string>
    #include <vector>
    #include <set>
    #include <map>
    #include <cstdio>
    using namespace std;
    
    string DAYS[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
    
    struct Statement {
        int type;
        int target;
    };
    
    int main() {
        freopen("logic.in", "r", stdin);
        freopen("logic.out", "w", stdout);
    
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int M, N, P;
        if (!(cin >> M >> N >> P)) return 0;
    
        vector<string> names(M);
        map<string, int> nameToId;
        for (int i = 0; i < M; i++) {
            cin >> names[i];
            nameToId[names[i]] = i;
        }
    
        string dummy;
        getline(cin, dummy);
    
        vector<pair<int, Statement>> stmts;
    
        for (int i = 0; i < P; i++) {
            string line;
            if (!getline(cin, line)) break;
            if (!line.empty() && line.back() == '\r') line.pop_back();
    
            string::size_type pos = line.find(": ");
            if (pos == string::npos) continue;
    
            string speaker = line.substr(0, pos);
            string content = line.substr(pos + 2);
    
            auto it = nameToId.find(speaker);
            if (it == nameToId.end()) continue;
            int sid = it->second;
    
            Statement st;
            st.type = 0;
            st.target = -1;
    
            if (content == "I am guilty.") {
                st.type = 1;
            }
            if (st.type == 0 && content == "I am not guilty.") {
                st.type = 2;
            }
            if (st.type == 0 && content.size() >= 9 && content.substr(0, 9) == "Today is ") {
                string day = content.substr(9);
                if (!day.empty() && day.back() == '.') day.pop_back();
                for (int d = 0; d < 7; d++) {
                    if (day == DAYS[d]) {
                        st.type = 5;
                        st.target = d;
                        break;
                    }
                }
            }
            if (st.type == 0 && content.size() >= 15 && content.substr(content.size() - 15) == " is not guilty.") {
                string name = content.substr(0, content.size() - 15);
                auto it2 = nameToId.find(name);
                if (it2 != nameToId.end()) {
                    st.type = 4;
                    st.target = it2->second;
                }
            }
            if (st.type == 0 && content.size() >= 11 && content.substr(content.size() - 11) == " is guilty.") {
                string name = content.substr(0, content.size() - 11);
                auto it2 = nameToId.find(name);
                if (it2 != nameToId.end()) {
                    st.type = 3;
                    st.target = it2->second;
                }
            }
    
            if (st.type != 0) {
                stmts.push_back({sid, st});
            }
        }
    
        set<int> suspects;
    
        for (int crim = 0; crim < M; crim++) {
            for (int day = 0; day < 7; day++) {
                vector<int> status(M, -1);
                bool ok = true;
    
                for (int j = 0; j < (int)stmts.size(); j++) {
                    int sid = stmts[j].first;
                    const Statement& st = stmts[j].second;
    
                    bool isTrue;
                    switch (st.type) {
                        case 1: isTrue = (sid == crim); break;
                        case 2: isTrue = (sid != crim); break;
                        case 3: isTrue = (st.target == crim); break;
                        case 4: isTrue = (st.target != crim); break;
                        case 5: isTrue = (st.target == day); break;
                        default: continue;
                    }
    
                    int s = isTrue ? 0 : 1;
                    if (status[sid] == -1) {
                        status[sid] = s;
                    } else if (status[sid] != s) {
                        ok = false;
                        break;
                    }
                }
    
                if (!ok) continue;
    
                int liars = 0, freeCnt = 0;
                for (int i = 0; i < M; i++) {
                    if (status[i] == 1) liars++;
                    else if (status[i] == -1) freeCnt++;
                }
    
                if (liars <= N && N <= liars + freeCnt) {
                    suspects.insert(crim);
                    break;
                }
            }
        }
    
        if (suspects.size() == 1) {
            cout << names[*suspects.begin()] << endl;
        } else if (suspects.size() > 1) {
            cout << "Cannot Determine" << endl;
        } else {
            cout << "Impossible" << endl;
        }
    
        return 0;
    }
    

    信息

    ID
    668
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    49
    已通过
    1
    上传者