注:我是把没有空格的名字补上空格了; 错误原因是输出“Cannot Determine”
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
int m,n,p;
string st[5]= {""," I am guilty."," is guilty."," I am not guilty."," is not guilty."};
string dst=" Today is ";
string day[8]= {"","Monday.","Tuesday.","Wednesday.","Thursday.","Friday.","Saturday.","Sunday."};
string name[21];
string name_[21];
struct talk
{
int kind;
bool crime;
string say;
string ob;
} t[110];
string temp;
int lie,unk;
int pos,la;
bool flag;
map<string,int>lier;
int main()
{
cin>>m>>n>>p;
for(int i=1; i<=m; ++i)
{
cin>>name_[i];
name[i]=' '+name_[i];
}
for(int i=1; i<=p; ++i)
{
cin>>temp;
temp.pop_back();
t[i].say=' '+temp;
getline(cin,temp);
if(temp==st[1])
{
t[i].ob=t[i].say;
t[i].kind=1;
t[i].crime=1;
continue;
}
if(temp==st[3])
{
t[i].ob=t[i].say;
t[i].kind=1;
t[i].crime=0;
continue;
}
for(int j=1; j<=m; ++j)
{
if(temp==name[j]+st[2])
{
t[i].ob=name[j];
t[i].kind=1;
t[i].crime=1;
break;
}
if(temp==name[j]+st[4])
{
t[i].ob=name[j],t[i].kind=1,t[i].crime=0;
break;
}
}
if(t[i].kind) continue;
for(int j=1; j<=7; ++j)
if(temp==dst+day[j])
{
t[i].ob=day[j],t[i].kind=2;
break;
}
if(t[i].kind) continue;
t[i].kind=3;
}
for(int j=1; j<=7; ++j)
for(int i=1; i<=m; ++i)
{
lie=0;
unk=0;
lier.clear();
flag=1;
for(int k=1; k<=p; ++k)
{
if(t[k].kind==3) continue;
else if(t[k].kind==2)
{
if(t[k].ob==day[j])
{
if(lier[t[k].say]==0) lier[t[k].say]=2;
else if(lier[t[k].say]==1)
{
flag=0;
break;
}
}
else
{
if(lier[t[k].say]==0) ++lie,lier[t[k].say]=1;
else if(lier[t[k].say]==2)
{
flag=0;
break;
}
}
}
else
{
if((t[k].ob==name[i] && t[k].crime==1) || (t[k].ob!=name[i] && t[k].crime==0))
{
if(lier[t[k].say]==0) lier[t[k].say]=2;
else if(lier[t[k].say]==1)
{
flag=0;
break;
}
}
else
{
if(lier[t[k].say]==0) ++lie,lier[t[k].say]=1;
else if(lier[t[k].say]==2)
{
flag=0;
break;
}
}
}
}
for(int i=1;i<=m;++i)
if(lier[name[i]]==0)
++unk;
if(flag && lie<=n && lie+unk>=n)
{
if(la==0) ++pos,la=i;
else if(la!=i)
{
cout<<"Cannot Determine";
return 0;
}
}
}
if(pos==1) cout<<name_[la];
else if(pos==0) cout<<"Impossible";
return 0;
}