#include<bits/stdc++.h>
using namespace std;
int m,n,p,ans=-1,crim,date;
int op[30],is[30],nw[30];
string str[30];
vector<int> o[30],wrd[30],pdd[30];
map<string,int> name;
bool cmp(string a,string b) {
int rro=min(a.size(),b.size());
for(int i=0; i<rro; i++)
if(a[i]!=b[i])
return false;
return true;
}
void tak(string s) {
string a,b,c;
int who;
int jl=s.length();
for(int i=0; i<jl; i++) {
if(s[i]==':') {
a=s.substr(0,i);
b=s.substr(i+2,s.size()-i-1);
break;
}
}
who=name[a];
if(cmp(b,"I am guilty.")) {
if(is[who]==-1) {
cout<<"Impossible";
exit(0);
}
is[who]=1;
return;
}
if(cmp(b,"I am not guilty.")) {
if(is[who]==1) {
cout<<"Impossible";
exit(0);
}
is[who]=-1;
return;
}
for(int i=0; i<b.size(); i++) {
if(b[i]==' ') {
a=b.substr(0,i);
b=b.substr(i+1,s.size()-i);
break;
}
}
if(name[a] && cmp(b,"is guilty.")) {
o[who].push_back(name[a]);
return;
}
if(name[a] && cmp(b,"is not guilty.")) {
wrd[who].push_back(name[a]);
return;
}
for(int i=0; i<b.size(); i++) {
if(b[i]==' ') {
c=b.substr(0,i);
b=b.substr(i+1,s.size()-i);
break;
}
}
if(cmp(a,"Today") && cmp(c,"is")) {
if(cmp(b,"Monday.")) {
pdd[who].push_back(1);
return;
}
if(cmp(b,"Tuesday.")) {
pdd[who].push_back(2);
return;
}
if(cmp(b,"Wednesday.")) {
pdd[who].push_back(3);
return;
}
if(cmp(b,"Thursday.")) {
pdd[who].push_back(4);
return;
}
if(cmp(b,"Friday.")) {
pdd[who].push_back(5);
return;
}
if(cmp(b,"Saturday.")) {
pdd[who].push_back(6);
return;
}
if(cmp(b,"Sunday.")) {
pdd[who].push_back(7);
return;
}
}
return;
}
bool check() {
memset(nw,0,sizeof nw);
for(int i=1; i<=m; i++) {
if(is[i]!=0) {
if(i==crim) {
if(is[i]==1)
nw[i]=1;
else if(is[i]==-1)nw[i]=-1;
} else {
if(is[i]==1)
nw[i]=-1;
else if(is[i]==-1)nw[i]=1;
}
}
}
for(int i=1; i<=m; i++) {
for(int j=0; j<pdd[i].size(); j++) {
if(pdd[i][j]==date) {
if(nw[i]==-1)
return 0;
else nw[i]=1;
} else {
if(nw[i]==1)
return 0;
else nw[i]=-1;
}
}
}
for(int i=1; i<=m; i++) {
for(int j=0; j<o[i].size(); j++) {
if(o[i][j]==crim) {
if(nw[i]==-1)
return 0;
else nw[i]=1;
} else {
if(nw[i]==1)
return 0;
else nw[i]=-1;
}
}
}
for(int i=1; i<=m; i++) {
int ppx=wrd[i].size();
for(int j=0; j<ppx; j++) {
if(wrd[i][j]==crim) {
if(nw[i]==1)
return 0;
else nw[i]=-1;
} else {
if(nw[i]==-1)
return 0;
else nw[i]=1;
}
}
}
int cnt1=0,cnt2=0;
for(int i=1; i<=m; i++) {
if(nw[i]==-1)
cnt1++;
else if(nw[i]==0)
cnt2++;
}
if(cnt1<=n&&cnt1+cnt2>=n)
return true;
return false;
}
int main() {
cin>>m>>n>>p;
for(int i=1; i<=m; i++) {
cin>>str[i];
name[str[i]]=i;
}
for(int i=1; i<=p; i++) {
char c;
string s="";
while((c=getchar())!=-1) {
if(c!='\n')
s+=c;
if(c=='\n'&&s.size()>=3)
break;
}
if(s.size()>=10)
tak(s);
}
for(int i=1; i<=m; i++) {
crim=i;
for(int j=1; j<=7; j++) {
date=j;
if(check() && (ans==-1 || ans==crim))
ans=crim;
else if(check() && ans!=-1 && ans!=crim) {
cout<<"Cannot Determine";
return 0;
}
}
}
if(ans==-1)
cout<<"Impossible";
else
cout<<str[ans];
return 0;
}
#3 #4 WA
#3 数据下载下来本地能过,OJ不能
testcase #3
in
5 1 5
A
B
C
D
E
A: Today is Monday.
B: Today is Thursday.
C: Today is Monday.
B: D is not guilty.
E: I am not guilty.
out(OJ)
Cannot Determine
out(local)
D