科技改变生活&进食后人
查看原帖
科技改变生活&进食后人
555833
haozexu楼主2024/10/25 14:49
  1. 正则表达式 <regex> 可用于匹配具有某种特征的表达式,例如本题 Today is XXX 的证词:
regex ing("([A-Z]+): I am not guilty\\.\\s*");
regex xg("([A-Z]+): ([A-Z]+) is guilty\\.\\s*");
regex day("([A-Z]+): Today is (Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\\.\\s*");
smatch mat;
if(regex_match(s,mat,day))
  return checkDay(mat[1],mat[2]);

即可检查是否匹配并返回第一个捕获组 ([A-Z]+) 与后面的星期。

  1. cin>>ws,getline(cin,statement[i]) 可以较为方便地获取一行,但是行末可能会有换行符,本题数据疑似是 Windows 下造的,不仅有 \n 还有 \r,但是上面的 regex 可以忽略这个问题。

  2. 本题 Cannot DetermineImpossible 的判定都建立在”凶手有且只有一个“这个前提下,所以如果有一种分配撒谎人的方案,以下设一定是罪人(即推理出确实有罪)的人的数目为 cntcnt

  • 满足 cnt=1cnt=1 的是合法方案,将其计入答案
  • 满足 cnt=0cnt=0 的,若此时只有一个人不确定是否有嫌疑,则将其计入答案,否则如有多个人不确定嫌疑即为 Cannot Determine
  • 否则满足 cnt=0cnt=0cnt>1cnt>1 的是非法推理
  • 如果最后计入答案的人有多个,为 Cannot Determine
  • 如果最后没有人被计入答案,为 Impossible

(这个卡了我好久)

  1. 在很老的帖子里的一个调试数据 https://www.luogu.com.cn/paste/4kuk7qu2,捞一把(里面 Hack 的人名不符合规范(含有数字,如果你用上面的 regex 是不能通过的)

  2. #11 中有一个人说了全部的日期,#2 中有人又说自己有罪又说自己无罪,这是不行的,不能又说真话又说假话;#9 有一个的人名是 I;

2024/10/25 14:49
加载中...