QOJ.ac

QOJ

時間限制: 2.0 s 記憶體限制: 512 MB 總分: 100 可 Hack ✓

#16931. 联合密码存储

统计

Johnny 是联合密码存储(Joint Password Storage,简称 JPS)系统的开发者。以明文形式存储密码是一个糟糕的主意。JPS 将每个密码拆分为多个部分并分别存储。

密码是一个由数字和英文字母组成的字符串。所有拆分部分的按位异或(XOR)值必须等于原密码。为了不引人注意,Johnny 决定让每个部分看起来都像是一些普通的东西,比如算术等式。还有什么比像 “2+2=4” 这样的等式更普通的呢?

形式上,密码的一个有效拆分是指一组长度与原密码相同的正确算术等式,使得在每个位置上,这些等式中字符的 ASCII 码的按位异或值等于原密码对应位置字符的 ASCII 码。一个正确的算术等式是一个由以下文法描述的字符串,且等号两边的表达式计算出的数值相等。运算符优先级为标准优先级:任何类型的括号中的表达式优先级最高,乘法优先级高于加法和减法,相同优先级的运算符从左到右依次计算。

$$\langle\text{equality}\rangle ::= \langle\text{expression}\rangle \text{ '=' } \langle\text{expression}\rangle$$ $$\langle\text{expression}\rangle ::= \langle\text{term}\rangle \mid \langle\text{expression}\rangle \text{ '+' } \langle\text{term}\rangle \mid \langle\text{expression}\rangle \text{ '-' } \langle\text{term}\rangle$$ $$\langle\text{term}\rangle ::= \langle\text{multiplier}\rangle \mid \langle\text{term}\rangle \text{ '*' } \langle\text{multiplier}\rangle$$ $$\langle\text{multiplier}\rangle ::= \langle\text{number}\rangle \mid \text{ '(' } \langle\text{expression}\rangle \text{ ')' } \mid \text{ '[' } \langle\text{expression}\rangle \text{ ']' } \mid \text{ '{' } \langle\text{expression}\rangle \text{ '}' }$$ $$\langle\text{number}\rangle ::= \text{ '0' } \mid (\text{ '1' } \mid \dots \mid \text{ '9' }) (\text{ '0' } \mid \dots \mid \text{ '9' })^*$$

为了方便起见,下面提供了所有相关字符的 ASCII 码:

( ) * + - 0-9 = A-Z [ ] a-z { }
40 41 42 43 45 48-57 61 65-90 91 93 97-122 123 125

您的任务是编写一个拆分模块,将密码转换为若干个正确的算术等式的按位异或。

输入格式

第一行包含一个整数 $P$ ($1 \le P \le 50$) —— 待拆分的密码数量。

接下来的 $P$ 行,每行包含一个字符串 —— 密码 $s$ ($10 \le |s| \le 50$)。密码可以包含数字、英文小写字母和英文大写字母。

输出格式

对于每个密码,如果不存在有效的拆分,输出一行单个单词 “NO”。

否则,第一行输出单个单词 “YES”。第二行输出一个整数 $k$ ($1 \le k \le 1000$) —— 拆分中等式的数量。接下来的 $k$ 行,每行输出一个等式。可以证明,如果存在解,则必然存在一个 $k$ 不超过 1000 的解。

样例

输入样例 1

3
1915090454
CanIAlwaysSplitIt
2020NorthwesternRussiaRegionalContestTaskJ

输出样例 1

YES
3
9+91*9=828
1+19+0=4*5
999=1008-9
NO
YES
7
420+[1*2*3*4*5*6]=140+[1*10*1*[20-5-5]*10]
10-1-{1}-{1}-{1}-{1}={1}+{1}+{1}+{{1}+{1}}
739=1+{3}*{2}*{9}*{9}-3+{2}*7*11*1+{100}+1
602211592866240={54321*67890}*9*{8*7*6*54}
51-188*1*0*600198090+5=[0]*(1039-25-4)+8*7
0*990-5127*11590*740*0*[3]*90=8*0*4885*2*8
3*0-0*818*39=0*(6+10*(64))*200*(93+6+8+19)

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.