本地+洛谷 IDE 所有样例正确 评测 30pts
查看原帖
本地+洛谷 IDE 所有样例正确 评测 30pts
602458
Rigel楼主2024/10/21 15:31

判了 \r\n。还是 WA 30 pts。评测记录

测试数据中所有点本地都可以过。

在线等解决方法,或者说我哪里写的有问题。

#include<bits/stdc++.h>
#define int long long
#define TT 998244353
#define maxm 25
#define maxp 110
using namespace std;

int m,n,p,tp,vis[maxm],ans;

struct node{
	int id,to1,to2,wk;
}a[maxp];

int h[maxm];

int aa[maxm];

string nam[maxm];

string anss;

inline int read(){
	int ret=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')ret=ret*10+(ch&15),ch=getchar();
	return ret*f;
}

void hsh(int x){
	string s="";
	getline(cin,s);
	while(s.back()=='\r'||s.back()=='\n')s.pop_back();
	int ret=0,tot=0;
	while(s[tot]>='A'&&s[tot]<='Z')nam[x]+=s[tot],ret=((ret*27)%TT+s[tot++]-'A'+1)%TT;
	h[x]=ret;
}

void init(int x){
	string s="";
	getline(cin,s);
	while(s.back()=='\r'||s.back()=='\n')s.pop_back();
	int ret=0,tot=0;
	while(s[tot]>='A'&&s[tot]<='Z')ret=((ret*27)%TT+s[tot++]-'A'+1)%TT;
	tot++;
	int id=0;
	for(int i=1;i<=m;i++)if(ret==h[i])id=i;
	if(!id)return;
	int p1=s.find(" I am guilty."),p2=s.find(" I am not guilty."),p3=s.find(" is guilty."),p4=s.find(" is not guilty."),p5=s.find(" Today is ");
	int cnt=0;
	
	if(p1!=-1)cnt++;
	if(p2!=-1)cnt++;
	if(p3!=-1)cnt++;
	if(p4!=-1)cnt++;
	if(p5!=-1)cnt++;
	
//	cout<<s<<" "<<cnt<<endl;
	
	if(cnt>1)return;
	if(p1!=-1){
		if(tot!=p1||tot+13!=s.size())return;
		a[++tp]=(node){id,id,0,0};
	}
	if(p2!=-1){
		if(tot!=p2||tot+17!=s.size())return;
		a[++tp]=(node){id,0,id,0};
	}
	if(p3!=-1){
		tot++;
		int res=0;
		while(s[tot]>='A'&&s[tot]<='Z')res=((res*27)%TT+s[tot++]-'A'+1)%TT;
		if(tot!=p3||tot+11!=s.size())return;
		int nid=0;
		for(int i=1;i<=m;i++)if(res==h[i])nid=i;
		if(!nid)return;
		a[++tp]=(node){id,nid,0,0};
	}
	if(p4!=-1){
		tot++;
		int res=0;
		while(s[tot]>='A'&&s[tot]<='Z')res=((res*27)%TT+s[tot++]-'A'+1)%TT;
		if(tot!=p4||tot+15!=s.size())return;
		int nid=0;
		for(int i=1;i<=m;i++)if(res==h[i])nid=i;
		if(!nid)return;
		a[++tp]=(node){id,0,nid,0};
	}
	if(p5!=-1){		
//		cout<<tot<<' '<<p5<<endl;
		if(tot!=p5)return;
		tot+=10;
		string ws="";
		while(s[tot]>='A'&&s[tot]<='Z'||s[tot]>='a'&&s[tot]<='z')ws+=s[tot++];
		if(tot+1!=s.size())return;
		if(ws=="Monday")a[++tp]=(node){id,0,0,1};
		if(ws=="Tuesday")a[++tp]=(node){id,0,0,2};
		if(ws=="Wednesday")a[++tp]=(node){id,0,0,3};
		if(ws=="Thursday")a[++tp]=(node){id,0,0,4};
		if(ws=="Friday")a[++tp]=(node){id,0,0,5};
		if(ws=="Saturday")a[++tp]=(node){id,0,0,6};
		if(ws=="Sunday")a[++tp]=(node){id,0,0,7};
	}
}


void check(){
	for(int now=1;now<=m;now++){
		for(int wk=1;wk<=7;wk++){
			int f=1;
			for(int i=1;i<=tp&&f;i++){
				if(vis[a[i].id]){
					if(a[i].to1)if(a[i].to1==now)f=0;
					if(a[i].to2)if(a[i].to2!=now)f=0;
					if(a[i].wk)if(a[i].wk==wk)f=0;
				}else{
					if(a[i].to1)if(a[i].to1!=now)f=0;
					if(a[i].to2)if(a[i].to2==now)f=0;
					if(a[i].wk)if(a[i].wk!=wk)f=0;
				}
			}
			if(f){
				if(aa[now]==0){
					aa[now]=1;
					ans++;
//					printf("wk=%lld now=%lld\n",wk,now);
				}
				anss=nam[now];
			}
		}
	}

}

void dfs(int now,int stp){
//	printf("now=%lld,stp=%lld\n",now,stp);
	if(stp>n){
//		for(int i=1;i<=m;i++){
//			if(vis[i])cout<<i<<' ';
//		}
//		printf("\n");
		check();
		return;
	}
	for(int i=now;i<=m;i++){
		if(vis[i])continue;
		vis[i]=1;
		dfs(i,stp+1);
		vis[i]=0;
	}
}

signed main(){
	m=read(),n=read(),p=read();
	for(int i=1;i<=m;i++)hsh(i);
	for(int i=1;i<=p;i++)init(i);
//	for(int i=1;i<=n;i++)printf("%lld ",h[i]);
//	for(int i=1;i<=tp;i++){
//		printf("id=%lld to1=%lld to2=%lld wk=%lld\n",a[i].id,a[i].to1,a[i].to2,a[i].wk);
//	}
	dfs(1,1);
	if(ans==1)cout<<anss<<"\n";
	if(!ans)printf("Impossible\n");
	if(ans>1)printf("Cannot Determine\n");
	return 0;
}

/*

10 7 20
A
AA
AAA
AAAA
AAAAA
AAAAAA
AAAAAAA
AAAAAAAA
AAAAAAAAA
AAAAAAAAAA
A: Today is Monday.
AA: Today is Monday.
AAA: Today is Monday.
AAAA: Today is Monday.
AAAAA: Today is Monday.
AAAAAA: Today is Monday.
AAAAAAA: Today is Monday.
AAAAAAAA: Today is Sunday.
AAAAAAAAA: Today is Sunday.
AAAAAAAAAA: Today is Sunday.
AAAAAAAAAA: AAA is not guilty.
AAAAAAAAA: A is not guilty.
AAAAAAAA: AAAAA is not guilty.
AAAAAAA: AAAAAA is guilty.
AAAAAA: AAAAAAAAAA is guilty.
AAAAA: AAAAAAAA is guilty.
AAAA: AAAAAAA is guilty.
AAA: AA is guilty.
AA: AAAAAAAAA is guilty.
A: AAAAA is guilty.


10 7 20
A
B
C
D
E
F
G
H
I
J
A: Today is Monday.
B: Today is Monday.
C: Today is Monday.
D: Today is Monday.
E: Today is Monday.
F: Today is Monday.
G: Today is Monday.
H: Today is Sunday.
I: Today is Sunday.
J: Today is Sunday.
J: C is not guilty.
I: A is not guilty.
H: E is not guilty.
G: F is guilty.
F: J is guilty.
E: H is guilty.
D: G is guilty.
C: B is guilty.
B: I is guilty.
A: E is guilty.


*/
2024/10/21 15:31
加载中...