第一个样例也能过,但是提交结果全是RE
求助神仙找原因,非常感谢
#include<cstdio>
int m,n,p,date;
void get(char* f) {
char p=getchar();
int x=0;
while(p=='\n')p=getchar();
while(p!='\n')*(f+x)=p,x++,p=getchar();
}
char name[22][262],word[101][262];
char ig[30]=": I am guilty.",ng[30]=": I am not guilty.";
char dg[30]=" is guilty.",dng[30]=" is not guilty.",cd[30]=": Today is ";
char wk[11][30]= {"ZZNB.","Monday.","Tuesday.","Wednesday.","Thursday.",
"Friday.","Saturday.","Sunday."
};
int dix,det;
bool canlie(int sit) {
int cnt=0;
while(sit) {
if(sit&1)cnt++;
sit>>=1;
}
return cnt==n;
}
bool lie_is(int sit,int num) {
return sit&(1<<(num-1));
}
int len(char* s) {
for(int i=0;; i++)if(!s[i])return i;
}
bool header(char* lng,char* nme,int name_ls) {
int nl=len(nme);
if(name_ls&&lng[nl]!=':')return 0;
for(int i=0; i<nl; i++)if(nme[i]!=lng[i])return 0;
return 1;
}
bool same(char* s1,char* s2) {
if(len(s1)!=len(s2))return 0;
for(int i=0; s1[i]; i++)if(s1[i]!=s2[i])return 0;
return 1;
}
int gve(int &a,int id) {
if(a>=0&&a!=id)return 1;
a=id;
return 0;
}
void jud(int lie) {
if(!canlie(lie)||dix)return ;
int tmm[22],week[11],cf=0;
for(int i=1; i<=m; i++)tmm[i]=-1;
for(int i=1; i<=7; i++)week[i]=-1;
for(int i=1; i<=p&&!cf; i++) {
int tlr,liar,nlen,cn,getdat=0;
for(int j=1; j<=m; j++)if(header(word[i],name[j],1))tlr=j;
liar=lie_is(lie,tlr),nlen=len(name[tlr]);
if(same(word[i]+nlen,ig))cf+=gve(tmm[tlr],1^liar);
else if(same(word[i]+nlen,ng))cf+=gve(tmm[tlr],0^liar);
else if(header(word[i]+nlen,cd,0)) {
for(int j=1; j<=7; j++)if(same(word[i]+nlen+11,wk[j]))getdat=j;
if(getdat)cf+=gve(week[getdat],1^liar);
} else {
for(int j=1; j<=m; j++)if(header(word[i]+nlen+2,name[j],1))cn=j;
if(cn&&same(word[i]+nlen+2+len(name[cn]),dg))cf+=gve(tmm[cn],1^liar);
else if(cn&&same(word[i]+nlen+2+len(name[cn]),dng))cf+=gve(tmm[cn],0^liar);
}
}
if(cf||dix)return ;
int is=0,tol=0,la;
for(int i=1; i<=7; i++)if(week[i]==1)is++;
else if(week[i]==0)tol++;
if(is>1||tol==7)return ;
is=0,tol=0;
for(int i=1; i<=m; i++)if(tmm[i]==1)is++,la=i;
else if(tmm[i]==0)tol++;
if(tol==m)return ;
if(is>1||!is)dix=1;
if(is==1) {
if(la==det||!det)det=la;
else dix=1;
return ;
}
}
int main() {
scanf("%d%d%d",&m,&n,&p);
for(int i=1; i<=m; i++)get(name[i]);
for(int i=1; i<=p; i++)get(word[i]);
for(int j=0; j<(1<<m)&&!dix; j++)jud(j);
if(dix)printf("Cannot Determine");
else if(det)printf("%s",name[det]);
else printf("Impossible");
}