不会是输入炸了吧
#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;
}