```cpp
//大模拟不写注释见祖宗
#include<bits/stdc++.h>
using namespace std;
const string p[7]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};//星期几
int n,m,t,ans,flg[25],chk[7],num[7],cnt[7];
string s[25],a[105],b[105];
inline bool check(int now){
memset(num,-1,sizeof(num));
memset(flg,-1,sizeof(flg));
memset(chk,-1,sizeof(chk));
memset(cnt,0,sizeof(cnt));//初始化
for(int i=1;i<=t;++i)
for(int j=1;j<=n;++j)
if(s[j]+':'==a[i]){//第 i 句式第 j 个人说的
if(b[i]=="I am guilty."){//我是罪犯
if(flg[j]==-1){
if(j==now)
flg[j]=1;
else
flg[j]=0;
} else{
if(flg[j]&&j!=now)
return 0;
if(!flg[j]&&j==now)
return 0;
}
} else if(b[i]=="I am not guilty."){//我不是罪犯
if(flg[j]==-1){
if(j==now)
flg[j]=0;
else
flg[j]=1;
} else{
if(flg[j]&&j==now)
return 0;
if(!flg[j]&&j==now)
return 0;
}
} else{
for(int k=1;k<=n;++k)
if(s[k]+" is guilty."==b[i]){//XXX 是罪犯
if(flg[j]==-1){
if(k==now)
flg[j]=1;
else
flg[j]=0;
} else{
if(flg[j]&&k!=now)
return 0;
if(!flg[j]&&k==now)
return 0;
}
break;
}
for(int k=1;k<=n;++k)
if(s[k]+" is not guilty."==b[i]){//XXX 不是罪犯
if(flg[j]==-1){
if(k==now)
flg[j]=0;
else
flg[j]=1;
} else{
if(flg[j]&&k==now)
return 0;
if(!flg[j]&&k!=now)
return 0;
}
break;
}
}
break;
}
for(int i=1;i<=t;++i)
for(int j=1;j<=n;++j)
if(s[j]+':'==a[i]){//第 i 句式第 j 个人说的
for(int k=0;k<7;++k)
if(b[i]=="Today is "+p[k]+'.'){
if(num[j]==-1)
num[j]=k;
else if(k!=num[j])
return 0;
if(~flg[j]){
if(~chk[k]&&chk[k]!=flg[j])
return 0;
chk[k]=flg[j];
}
++cnt[k];
}
}
int res=0;
for(int i=0;i<7;++i)
if(~chk[i]){
if(chk[i]){
if(res)
return 0;
res=i;
} else{
for(int j=1;j<=n;++j)
if(~num[j]&&num[j]==i)
flg[j]=0;
}
}
bool _=1;
for(int i=0;i<7;++i)
if(!cnt[i]||chk[i]){
_=0;
break;
}
if(_)
return 0;
if(res){//确定了星期几
int tot1=0,tot2=0;
for(int i=1;i<=n;++i)
tot1+=(!flg[i]),tot2+=(flg[i]==-1||!flg[i]);
if(tot2<m||tot1>m)
return 0;
} else{
int tot1=0,tot2=0,tot3=0,tot4=1e9,tot5=0;
for(int i=1;i<=n;++i)
tot1+=(flg[i]==1),tot2+=(flg[i]==1||flg[i]==-1);
for(int i=0;i<7;++i)
if(chk[i]==-1)
tot5+=cnt[i],tot3=max(tot3,cnt[i]),tot4=min(tot4,cnt[i]);
if(tot1+tot4>n-m||tot2-tot5+tot3<n-m)
return 0;
}
return 1;
}
int main(){
// freopen("detective.in","r",stdin);
// freopen("detective.out","w",stdout);
cin>>n>>m>>t;
for(int i=1;i<=n;++i)
cin>>s[i];
for(int i=1;i<=t;++i){
cin>>a[i];
getchar();
getline(cin,b[i]);
}
for(int i=1;i<=n;++i){
if(check(i)){
if(ans){
puts("Cannot Determine");
return 0;
}
ans=i;
}
}
if(ans)
cout<<s[ans]<<endl;
else
puts("Impossible");
return 0;
}
```
by qwq___qaq @ 2023-02-03 12:22:08