#include <bits/stdc++.h>
using namespace std;
const int Len = 256;
const int N = 25;
map<string,int> mapz;
string tmp,data[N];
string names[N];
char str[Len];
int n,m,k,cnt,xx[N];
int fake[N],date[N],num;
int link[N][N],notlink[N][N],speak[N],islink[N];
int zuifan,ans;
int tru[N];
string now;
bool flag;
map<string,int> dat;
bool check()
{
memset(tru,0,sizeof tru);
dat.clear();
now.clear();
flag=0;
for(int i = 1;i <= n;i++)
if(fake[i]) tru[i]=-1;
for(int i = 1;i <= n;i++)
{
if(link[i][zuifan])
{
if(tru[i] != -1) tru[i] = 1;
else return 0;
}
if(notlink[i][zuifan])
{
if(tru[i] != 1) tru[i] = -1;
else return 0;
}
for(int j = 1;j <= n;j++)
{
if(j == zuifan) continue;
if(link[i][j])
{
if(tru[i] != 1) tru[i] = -1;
else return 0;
}
if(notlink[i][j])
{
if(tru[i] != -1) tru[i] = 1;
else return 0;
}
}
}
for(int i = 1;i <= n;i++)
{
if(!date[i]) continue;
if(tru[i] == 1)
{
if(dat[data[i]] == 1) return 0;
if(flag and now != data[i]) return 0;
else flag=1,now=data[i];
}else if(tru[i] == -1){
dat[data[i]]=1;
if(data[i] == now) return 0;
}
}
if(dat[now]) return 0;
for(int i = 1;i <= n and flag;i++)
{
if(!date[i]) continue;
if(data[i] == now)
{
if(tru[i] != -1) tru[i]=1;
else return 0;
}
if(data[i] != now)
{
if(tru[i] != 1) tru[i]=-1;
else return 0;
}
}
int ccc=0,ddd=0;
for(int i = 1;i <= n;i++)
if(tru[i] == 1) ccc++;
else if(tru[i] == -1) ddd++;
if(ddd > m) return 0;
if(n-ccc < m) return 0;
if(flag == 0)
{
string dddq[]={"","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
for(int i = 1;i <= 7;i++)
{
int ppd=0,qqd=0;
for(int j = 1;j <= n;j++)
{
if(date[j] and data[j] == dddq[i]) ppd++;
if(date[j] and data[j] != dddq[i]) qqd++;
}
if(ddd+qqd <= m and n-(ccc+ppd) >= m) return 1;
}
return 0;
}
return 1;
}
string shake(string x)
{
int len=x.length();
for(int i = 0;i <= len-1;i++)
if(x[i] >= 'A' and x[i] <= 'Z') x[i]=x[i]-'A'+'a';
return x;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i = 1;i <= n;i++)
{
cin >> tmp;
mapz[tmp]=++cnt;
names[i]=tmp;
}
for(int id = 1,x;id <= k;id++)
{
scanf("%s",str),str[strlen(str)-1]='\0';
tmp = str;
int index = mapz[tmp];
if(speak[index] == 0) speak[index]=1,num++;
getline(cin,tmp);
string pdd = shake(tmp);
// cout << pdd<< endl;
if(pdd.find("i am guilty.") != -1) xx[index]=1,link[index][index]=1;
else if(pdd.find("i am not guilty.") != -1) notlink[index][index]=1;
else if(pdd.find("today is") != -1){
string dd;
for(int i = 10;i < tmp.length();i++)
{
if(tmp[i] != '.' and tmp[i] != ' ') dd+=tmp[i];
else break;
}
if(date[index] and data[index] != dd and fake[index] == 0) fake[index]=1;
date[index]=1;
data[index]=dd;
// cout << dd << endl;
}else if(pdd.find("is guilty.") != -1){
string dd;
for(int i = 1;tmp[i] != ' ';i++) dd += tmp[i];
if(islink[index] and islink[index] != mapz[dd]) fake[index]=1;
link[index][mapz[dd]]=1;
islink[index]=index;
// cout << dd << endl;
}else if(pdd.find("is not guilty.") != -1){
string dd;
for(int i = 1;tmp[i] != ' ';i++) dd += tmp[i];
notlink[index][mapz[dd]]=1;
// cout << dd << endl;
}
}
for(int i = 1;i <= n;i++)
{
zuifan=i;
if(check())
{
if(ans) return printf("Cannot Determine\n"),0;
ans=i;
}
}
if(ans == 0) printf("Impossible\n");
else cout << names[ans] << endl;
return 0;
}
没有下载次数了QAQ,数据没保存下来