Problem Statement
Adam刚刚实现了一种字符串子串搜索算法,他声称该算法比传统的 KMP(Knuth–Morris–Pratt)算法工作得更快。为了庆祝这一点,Adam决定创造一种新的语言PION(他声称这是 完全基于指令的语言 的缩写),它只基于字符串子串搜索。
PION语言只包括两种指令。 pattern:replacement 和 pattern::replacement。这里,pattern 和 replacement 可能是空字符串,其字符的ascii码在32和126之间。它们不能以空格(ascii代码32)开始或结束,任何这样的空格将被忽略。例如," a b : " 是一个有效的指令,pattern 是 "a b",replacement 是 ""(空字符串)。
PION中的一个程序由许多指令组成。当程序被执行时,输入字符串将被保存在一个缓冲区中。对于每一轮,解释器将扫描所有的指令。对于每个指令,pattern 字符串将在缓冲区中被搜索,看它是否作为子串出现。第一个这样的(pattern 作为子串出现)指令将被执行。要执行一个指令,第一次出现的 pattern 字符串将被替换为 replacement 字符串。如果 pattern 字符串是空的,replacement 字符串将被插入到缓冲区的开头。在执行完一个 :: 类型的操作后,程序将停止。在执行了一个 : 类型的操作后,另一轮将开始。如果在某一轮中没有执行任何操作,程序也将停止。程序的输出将是缓冲区中的最终字符串。
为了保持执行速度,亚当设置了以下限制。
- 程序的长度(总字符数)不能超过1000
- 最多可以执行50000轮
- 每一轮结束后,缓冲区内的字符串长度不能超过500。
为了证明这种语言的能力,亚当设计了10个计算任务。你的任务是用令人印象深刻的PION语言来解决这些任务!
Sample Task
考虑如下任务:如果输入字符串包含任何 "a",则按原样输出,否则删除输入字符串中的所有 "x" 并输出。
下面是一个解决这个任务的PION程序。当然,最后一行是没有必要的。
a::a
x:
excited::excited
Grading
对于每一项任务,如果你的程序不能在上述限度内正确完成计算任务,你将得不到任何分数。否则,你的分数取决于所提供的 .in 文件。.in 文件的第二行包含十个整数。如果你的程序的行数不超过其中的 $x$ 个,你将得到 $x$ 分。
在选手文件夹下,提供了 checker.cpp 。编译后,运行 checker 获得你的分数,checker x 获得你在 $x$ 号输入上的执行细节。除了随机数发生器和输入/输出格式外,评判系统中的检查器与提供的检查器完全相同。
Task Description
以下每项任务的分值为10分(详见评分部分)。它们的评分参数提供为 lang1.in-lang10.in。为了方便,在评分参数之后,我们在对应的 .in 文件中也提供了这些任务的描述。
- 任务1: 输入一个长度为1-20的只包含o的字符串。如果其长度为奇数,则输出 odd,否则输出 even。例如,ooo->odd,oooo->even。
- 任务2:输入一个长度为3到10的只包含o的字符串,用x替换右数第三个o,例如,oooo->oxoo。
- 任务3:输入一个长度为1到9的只含o的字符串,并输出一个长度为10-原长度的字符串。例如,oooo->oooooo。
- 任务4:输入一个长度为1到20的只包含012的字符串,并输出它的数字之和对3取模的结果。例如,012->0,221->2,112->1。
- 任务5:输入一个长度为1到20的只含01的数字串,并将各位取反。例如,01->10,100->011。
- 任务6:输入一个长度为1到20的只包含01的数字串,并将其颠倒输出。例如,00101->10100。
- 任务7:输入一个长度为1到200的只包含01的数字串,将其排序并输出。例如,00101->00011。
- 特别限制:运行轮数不能超过500(而不是50000)。
- 任务8:输入一个只包含o的长度为2到30的偶数的串,在正中间插入字符|。例如,oooo->oo|oo。
- 任务9:输入一个长度为6的只包含l(小写的L)和1(一)的字符串,在相邻的两个字符之间插入1,2,3,4,5个o。例如,1ll1l1->1oloolooo1oooolooooo1。
- 任务10:输入一个长度为$n^2$的字符串($1\le n\le 14$),输出一个只包含o的长度为n的字符串,例如ooooooooo->ooo。