<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]+) 与后面的星期。
cin>>ws,getline(cin,statement[i]) 可以较为方便地获取一行,但是行末可能会有换行符,本题数据疑似是 Windows 下造的,不仅有 \n 还有 \r,但是上面的 regex 可以忽略这个问题。
本题 Cannot Determine 和 Impossible 的判定都建立在”凶手有且只有一个“这个前提下,所以如果有一种分配撒谎人的方案,以下设一定是罪人(即推理出确实有罪)的人的数目为 cnt :
Cannot DetermineCannot DetermineImpossible(这个卡了我好久)
在很老的帖子里的一个调试数据 https://www.luogu.com.cn/paste/4kuk7qu2,捞一把(里面 Hack 的人名不符合规范(含有数字,如果你用上面的 regex 是不能通过的)
#11 中有一个人说了全部的日期,#2 中有人又说自己有罪又说自己无罪,这是不行的,不能又说真话又说假话;#9 有一个的人名是 I;