求助,本地样例可过,洛谷全RE
查看原帖
求助,本地样例可过,洛谷全RE
56489
一只小兔子楼主2020/10/11 04:00

第一个样例也能过,但是提交结果全是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");
}
2020/10/11 04:00
加载中...