30 pts 求条
查看原帖
30 pts 求条
735797
XingnoYi楼主2025/7/29 14:29

不会是输入炸了吧

#include <iostream>
#include <map>
#include <vector>
#define big long long
using namespace std;
big m,n,q,note[22];
string name[22],ans;
map <string,big> flg;
map <string,big> idx; // 姓名->编号
vector <string> word[22];
string day[10]={">_<","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
map <string,big> wk;
string change(string s)
{
    string rt = "";
    for(big i = 1;i < s.length();i++) rt += s[i];
    return rt;
}
big check(string s,big d,big g,big p)
{
    if(s[0]=='T' && s[1]=='o')
    {
        string tmp = s.substr(9,s.length()-10);
        return (wk[tmp]==d);
    }
    if(s[0]=='I' && s[2] == 'a')
    {
        return (s[5]=='g'?(p==g):(p!=g));
    }
    big l = s.length();
    string tmp;
    tmp = s.substr(0,s.length()-11-((s[l-9]=='t')*4)); // 提取名字,神秘不神秘
    big pos = idx[tmp];
    return (s[l-9]=='t'?(pos!=g):(pos==g));
}
int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> m >> n >> q;
    for(big i = 1;i <= m;i++)
    {
        cin >> name[i];
        flg[name[i]+" is guilty."] = 1;
        flg[name[i]+" is not guilty."] = 1;
        idx[name[i]] = i;
        idx[name[i]+":"] = i;
    }
    for(big i = 1;i <= 7;i++)
    {
        flg["Today is "+day[i]+"."] = 1;
        wk[day[i]] = i;
    }
    flg["I am guilty."] = 1, flg["I am not guilty."] = 1;
    while(q--)
    {
        string tmp;
        cin >> tmp;
        big id = idx[tmp]; // 取出说话人编号
        getline(cin,tmp);
        tmp = change(tmp);
        if(flg.find(tmp) == flg.end()) continue;
        word[id].push_back(tmp);
    }
    for(big i = 1;i <= 7;i++) // 枚举今天是星期几
    {
        for(big j = 1;j <= m;j++) // 枚举罪犯是谁
        {
            big flag = 1, cnt = 0, say = 0, mid = 0; // 中立的人可以是说真话的,也可以是说假话的
            for(big p = 1;p <= m;p++) // 判断这个人说的是真话还是假话
            {
                say = 0;
                big ch[2]={};
                for(big ii = 0;ii < word[p].size();ii++)
                {
                    say = 1;
                    string s = word[p][ii];
                    ch[check(s,i,j,p)] = 1;
                    if(ch[0]&&ch[1])
                    {
                        flag = 0;
                        break;
                    }
                }
                if(!flag) break;
                cnt += ch[0];
                mid += (!say);
            }
            if(!flag) continue;
            //cout << cnt << " " << mid << " " << i << " "+name[j] << endl;
            if(cnt+mid >= n && cnt <= n) note[j] = 1;
        }
    }
    big tot = 0;
    for(big i = 1;i <= m;i++)
    {
        tot += note[i];
        if(note[i]) ans = name[i];
    }
    cout << (tot?(tot==1?ans:"Cannot Determine"):"Impossible");
    return 0;
}
2025/7/29 14:29
加载中...