Codeforces Round 834 Div3 Sim-Sim问题代码提交错误排查求助
Codeforces Round 834 Div3 Sim-Sim 代码错误排查
核心错误:字符大小写不匹配
你的代码中判断字符时使用了大小写混合的写法(比如'Y'是大写,'e'、's'是小写),但题目中的输入字符串是全大写的(例如YES、ESY)。这会导致所有合法的输入都无法匹配到正确的条件分支,直接输出NO,这是提交错误的最主要原因。
其他错误与问题
1. 长度为2的字符串判断遗漏合法情况
根据问题规则,YE是合法的Sim-Sim字符串(属于YES循环的连续两位),但你的代码仅将SY和ES判定为合法,遗漏了YE,导致这类测试用例输出错误结果。
2. is_the_same函数逻辑混乱且冗余
- 循环条件
while len(palavraa)!=0毫无意义,因为函数内从未修改过palavraa的长度,循环只能通过break终止,容易出现逻辑漏洞。 - 检查逻辑绕远路:正确的判断逻辑应该是基于循环单元的模运算,即对于字符串的每个位置
k,字符应等于对应循环单元的k % 3位,而你的代码通过维护三个索引逐个检查,逻辑复杂且容易出错。
3. 主函数存在重复的条件分支
代码中有两个完全相同的elif分支:
elif palavra[0]=='e' and palavra[1]=='s' and palavra[2]=='Y': ...
这属于冗余代码,虽然不会直接导致错误,但会降低代码可读性,也容易让人误以为覆盖了更多情况。
修复后的代码示例
def is_sim_sim(s): # 定义所有合法的循环单元 units = ["YES", "ESY", "SYE"] # 检查长度为2的情况 if len(s) == 2: return any(s == unit[:2] or s == unit[1:] for unit in units) # 检查长度≥3的情况 for unit in units: valid = True for i in range(len(s)): if s[i] != unit[i % 3]: valid = False break if valid: return True return False t = int(input()) for _ in range(t): s = input().strip() if len(s) < 2: print("NO") else: print("YES" if is_sim_sim(s) else "NO")
修复说明
- 统一使用大写字符匹配,符合题目输入格式。
- 长度为2的情况:检查是否是任意合法循环单元的连续两位(包括前两位和后两位),覆盖所有合法情况。
- 长度≥3的情况:遍历所有合法循环单元,通过模运算检查每个位置的字符是否符合循环规则,逻辑简洁清晰。
- 移除冗余代码,优化输入处理逻辑。
内容的提问来源于stack exchange,提问作者David feoerwg
相关产品推荐
相关产品推荐

