判了 \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.
*/