我在本题中用getline 读入证词,在本机上(用的noilinux)去掉最后一个字符,输出看起来还是正常的,但与其它字符串匹配不上。
在洛谷上必须要去掉才能过
洛谷的测评环境不是 linux 吗
代码:
#include<bits/stdc++.h>
using namespace std;
int m,n,p;
string name[25],say[105];
string s[7]={"Today is Sunday.","Today is Monday.","Today is Tuesday.","Today is Wednesday.","Today is Thursday.","Today is Friday.","Today is Saturday."};
int spkr[105],fake[25],err,ans;
inline void update(int who,int is){
if(fake[who]*is==-1)err=1;
else fake[who]=is;
}
int main(){
scanf("%d%d%d",&m,&n,&p);
for(int i=1;i<=m;i++)cin>>name[i];
for(int i=1;i<=p;i++){
string nam;cin>>nam;
nam.erase(nam.end()-1);
for(int j=1;j<=m;j++)if(name[j]==nam)spkr[i]=j;
getline(cin,say[i]);
say[i].erase(say[i].begin());say[i].erase(say[i].end()-1);
}
for(int day=0;day<7;day++){
for(int fak=1;fak<=m;fak++){
memset(fake,0,sizeof(fake));err=0;
for(int i=1;i<=p;i++){
int who=spkr[i];
// cout<<i<<" "<<spkr[i]<<say[i]<<endl;
for(int j=0;j<7;j++)if(say[i]==s[j])update(who,(j==day?1:-1));
if(say[i]=="I am guilty.")update(who,(fak==who?1:-1));
if(say[i]=="I am not guilty.")update(who,(fak!=who?1:-1));
for(int j=1;j<=m;j++)if(say[i]==name[j]+" is guilty.")update(who,(j==fak?1:-1));
for(int j=1;j<=m;j++)if(say[i]==name[j]+" is not guilty.")update(who,(j!=fak?1:-1));
}
if(err)continue;
int cnt1=0,cnt2=0;
for(int i=1;i<=m;i++){
if(fake[i]==-1)cnt1++;
if(fake[i]==0)cnt2++;
}
if(cnt1+cnt2>=n&&cnt1<=n){//cout<<cnt1<<" "<<cnt2<<endl;
if(!ans)ans=fak;
else if(fak!=ans){//cout<<name[ans]<<" "<<name[fak]<<endl;
puts("Cannot Determine");
return 0;
}
}
}
}
if(!ans)puts("Impossible");
else cout<<name[ans];
return 0;
}