背景
事件是一种非常不常见的编程语言,它的令牌列表不是预先确定的,而是从输入中推断出来的。这样,对事件程序进行标记可能会非常困难,尤其是如果您想高效地这样做。这项任务是您自己做的。
任务
您的程序将被提供一个字符串作为输入。这是Incident用于标记它的算法:
- 完全以三种方式识别作为输入的子字符串出现的所有字符串(即,该字符串在输入中恰好出现了三个)。
- 丢弃所有这些字符串中的任何一个,这些字符串是另一个此类字符串的子字符串(例如,对于input
ababab
,剩下的唯一字符串将是ab
,nota
或b
,因为a
和b
都是的子字符串ab
)。 - 丢弃输入中重叠的所有字符串。(例如,
aaaa
正好包含的三个副本aa
,但是这些副本在第二个和第三个字符处重叠,因此将被丢弃。同样,在中abababa
,存在的三个副本ab
和的三个副本ba
,但第二个至第六个字符分别位于的重叠ab
和ba
,这样既ab
和ba
将被丢弃)。 - 此时剩下的任何字符串都是程序使用的标记。将原始输入标记为这些标记的序列(由于上一步中的丢弃,只有一种方法可以做到)。输入中不属于任何标记的任何字符都将被视为注释并被丢弃。
您的程序必须将字符串作为输入,并返回该字符串的相应标记化(标记列表,每个标记均表示为字符串)作为输出。此外,这必须至少适度地有效地完成;具体来说,程序必须在二次时间(“ O(n²)”)或更短的时间内运行。(顺便提一下,几乎肯定有可能比平方更快,但这不是最快算法,因此可以随意使用最复杂的算法,找到适合复杂度范围的算法。)
澄清说明
- 尽管理论上事件程序可以包含256个八位字节中的任何一个,但出于此挑战的目的,您的程序只能处理由可打印ASCII(包括空格),换行符和制表符组成的输入,这是可以接受的。(所有已知的突发事件程序都将自己限制在此子集中)。请注意,空格/换行符/制表符不是特殊的,可以出现在标记的中间。事件将所有256个八位位组视为不透明。
- “二次时间”的定义是“如果输入的大小加倍,则程序将以不超过常数加4的速度慢运行”,即,如果t(x)是程序花费的最长时间。处理一个大小为x的输入,则必须有一个常数k,使得所有x的t(2 x)<4 t(x)+ k。请记住,比较字符串所花费的时间与字符串的长度成正比。
- 如果以具有无限内存并使用无界整数的语言(可能是假设的)变体运行,则从理论上讲,您的程序应该能够处理任何长度的输入程序(如果在实践中由于以下原因而无法达到此目标,则可以:语言的整数或内存实际上是有限的)。您可能会假设(出于计算复杂度的目的)可以在恒定时间内比较不大于输入长度的整数(尽管请记住,如果使用较大的值,例如由于将输入转换为整数)整数),它们将花费一定的时间与它们所拥有的位数成正比。
- 您可以使用适合复杂性范围的任何算法,即使它没有遵循与上面发布的算法相同的步骤,只要它能产生相同的结果即可。
- 这个难题是关于标记输入,而不是真正格式化输出。如果以您的语言输出列表的最自然的方式是模棱两可的格式(例如,当字符串包含文字换行符或字符串之间没有定界符时,则用换行符分隔),请不必担心输出结果最终会模棱两可( (只要列表是实际构建的)。您可能需要制作第二个版本的提交文件,以产生明确的输出,以帮助测试,但是原始版本是计分的版本。
测试用例
对于以下输入字符串:
aaabcbcbcdefdfefedghijghighjkllkklmmmmonono-nonppqpq-pqprsrsrstststuvuvu
您的程序应产生以下输出列表:
a a a bc bc bc d e f d f e f e d gh gh gh k l l k k l pq pq pq u u u
胜利条件
这是代码高尔夫,因此以字节为单位的最短有效(即正确的输入/输出行为和足够快的执行速度)程序获胜。