【发布时间】:2017-07-30 00:40:54
【问题描述】:
(这是this codeforces problem的基础)
我尽量不寻求有关 codeforces 问题的帮助,除非我真的,真的,卡住了,这恰好是现在。
你的第一个任务是找到火星数据库的密码。为此,您最好的秘密特工已经发现了以下事实: 密码是给定字符串的子字符串,由一系列非递减数字组成 密码尽可能长 密码始终是回文 回文是一个向后读取相同的字符串。赛车、鲍勃和中午是著名的例子。 鉴于这些事实,你能找到数据库所有可能的密码吗? 输入 第一行包含 n,即输入字符串的长度(1 ≤ n ≤ 105)。 下一行包含一个长度为 n 的字符串。该字符串的每个字符都是一个数字。 字符串中的数字按非递减顺序排列。 输出 在第一行,打印可能的密码数量 k。 在接下来的 k 行中,按字母顺序打印可能的密码。
我的观察是:
非递减字符串中的回文只是一串重复字符(例如“4444”或“11”)
在字符
i上,i的最后一个实例-i的第一个实例+1 =重复字符的长度跟踪最大密码长度,然后过滤掉每个小于最大密码长度的项目,保证输出的密码是最大长度
我基于这些观察的解决方案是:
n,s = [input() for i in range(2)]#input
maxlength = 0
results = []
for i in s:
length = (s.rfind(i)-s.find(i))+1
if int(i*(length)) not in results and length>=maxlength:
results.append(int(i*(length)))
maxlength = length
#filer everything lower than the max password length out
results = [i for i in results if len(str(i))>=maxlength]
#output
print(len(results))
for y in results:
print(y)
不幸的是,这个解决方案是错误的,实际上并在第 4 次测试用例中失败了。我不明白代码有什么问题,所以我无法修复它。有人可以帮忙吗?
感谢阅读!
【问题讨论】:
-
是 b/c 失败会生成错误的答案,还是 b/c 需要太长时间?
-
您的问题基本上归结为查找给定字符串中长度> 1 的回文总数。如果我错了,请纠正我,如果可以的话,请给我一个反例。
-
它失败了,因为它生成了错误的答案。此外,它不仅意味着给定字符串中长度> 1的回文,还意味着长度> =找到的最长回文。例如,如果我找到一个回文“44”,然后我找到另一个“77777”,我必须丢弃“44”和任何其他较短的回文,因为它不再是最大长度。 幸运的是,Peter de Rivas 好心地指出问题在于将答案存储为整数而不是字符串!