1049: fantasime 的魔法工坊
Description
多年以后,当你面对 “脱不掉魔法师的长袍” 的批评时,一定会想起那个走进 fantasime 工坊的傍晚。
多么荣幸啊!你成为了 $2^{2^{2}}$ 世纪最伟大的魔法师 fantasime 的弟子!当你推开工坊的那古朴厚重的木门的时候,既没有想象中的木制家具占据这个房间,也没有充满神秘色彩的瓶瓶罐罐能够吸引你的视线。让人意想不到的,在这藏匿于偏远荒原的魔法木屋的厅中竟只有一台奇怪形状的机器!
“这台机器是魔法发生器。” fantasime 向你说明,他早已简化了那些复杂的魔法阵的画法,让不会画画的人也有使用魔法的权力。“都什么年代了,还在画传统魔法阵!有了这台魔法发生器,只要能敲键盘就可以一睹魔法的深渊!”
作为 fantasime 的弟子,你的任务就是学会使用这台魔法发生器。但是 fantasime 很懒,他甩给你一本魔法发生器的用户手册便回自己的卧室睡觉了。
你并没有在意 fantasime 的冷漠,面前这台立方体的机器早已令你陷入了自己魔法生涯的回忆当中。为了将魔法阵画得完美,你练习用掉的纸张比面前这台复杂机器的零件更多;为了能进入这间工坊,你在魔法考试中的作品远比面前这台丑陋机器华丽,但这一切在这台可怖机器面前变得毫无意义。
无论怎样,你还是不得不看这台冰冷机器的用户手册:
属性:属性 决定了魔法所释放力量的类型。它是一个仅由小写英文字母构成的字符串,具体属性请查阅本手册后的附录:属性列表。
形:形 决定了魔法所释放力量的形式。它是一个仅有小写英文字母构成的字符串,具体属性请查阅本手册后的附录:形列表。
核:核 是描述一个魔法的最基本单位,每个魔法至少有一个 核。核 由一个 属性,零个或一个或多个 形 组成。它的基本形式为:
<属性>[形,...]
。其中<属性>
叫做 属性块。[形,...]
叫做 形列表,形 与 形 之间用,
分隔,形列表 中最后一个 形 后没有,
。魔法块:魔法块 是一个完整的魔法,它由一个或多个 核 组成。它的基本形式为
{核,...}
,其中 核 和 核 之间用,
分隔,最后一个 核 后没有,
。用户将一个合法 魔法块 输入到 魔法发生器 中,机器便会自动生成魔法阵并生产出来。不过 魔法发生器 只能识别该手册属性列表中的 属性 和形列表中的 形。一个合法的 魔法块 中允许包含空格。
附录:属性列表
fire
,water
,air
,earth
,wood
,me
,tal light
,dark
,time
,life
附录:形列表
cluster
,scatter
,expand
,float
,knot
,twist
,shatter
,reverse
,shift
显然在使用这台机器之前,你需要判断什么样的魔法块是合法的。
Input
输入一行,一个仅包含小写字母、{
、}
、[
、]
、<
、>
和空格的字符串 $S$($1 <|S| \le 2 \times 10^5$)。
Output
对于一个合法的魔法块,输出 “YES”(没有引号);否则输出 “NO”(没有引号)。
Sample Input Copy
{<fire>[cluster,cluster,cluster]}
Sample Output Copy
YES
HINT
为了方便理解,以下给出一些合法的魔法块和非法的魔法块。
以下的魔法块都是合法的:
{<fire>[cluster,float]}
{<wood>[knot]}
{<water>[twist],<water>[twist]}
{<fire>[float],<air>[expand,shift]}
{ < fire> [float], <air >[ expand , shift] }
以下的魔法块是非法的:
{<fi re>[cluster,float]}
:属性块中仅能有一个属性。
{<wood>[kn ot]}
:形列表中形应该用 ,
分隔。
{water[twist]}
:核形式非法。
{<water>twist}
:核形式非法。
{<fire>[float],<air>[expand,shirt]}
:形列表中形不匹配。
<wood>[knot]
:核并不是一个魔法块。
{<fire>[float] <air>[expand]}
:核之间应该用 ,
分隔。
{<QAQ>[cry]}
:属性不匹配,形也不匹配。