U263724 说“说‘说“你好!”!’!”!(Say “Say ‘Say “Hello!”!’!”!)

题目背景

> **不熟悉 C/C++ 编程语言的,建议仔细阅读此段。** > > 在 C/C++ 语言中,字符串常量用双引号对 `""` 括起来。在字符串常量中,双引号 `"` 用 `\"` 表示,换行符用 `\n` 表示,反斜杠 `\` 用 `\\` 表示。 > > 例如字符串: > ``` > "C:\Hello World.exe" > Good morning! > ``` > 表示成 C/C++ 语言的字符串常量为: > ```c > "\"C:\\Hello World.exe\"\nGood morning!" > ``` --- 通常在 C/C++ 语言中,如果我们要输出一个字符串,像这样(注意末尾有换行符): ``` Hello! ``` 我们会使用如下代码: ```c printf("Hello!\n"); ``` 其中,换行符用 `\n` 替代。 代码本身也是一个字符串。如果要输出上面这行代码的内容,又该怎么做呢? 答案是:对于上述代码字符串,将反斜杠 `\` 全部替换成 `\\`,将双引号 `"` 全部替换成 `\"`,在整个字符串的前面加上 `printf("`,后面加上 `");`,得到如下代码: ```c printf("printf(\"Hello!\\n\");"); ``` 运行这行代码,屏幕上将会显示如下内容: ``` printf("Hello!\n"); ``` 我们称 `printf("Hello!\n");` 为原字符串 `Hello!`(末尾带换行符)的输出嵌套,也称 $\bm 1$ **层输出嵌套**;`printf("printf(\"Hello!\\n\");");` 为原字符串的 $\bm 2$ **层输出嵌套**($1$ 层输出嵌套的 $1$ 层输出嵌套)……以此类推。 类似地,`Hello!`(末尾带换行符)的 $\bm 3$ **层输出嵌套**为: ```c printf("printf(\"printf(\\\"Hello!\\\\n\\\");\");"); ``` 上面只是以 `Hello!`(末尾带换行符)这个字符串举例,本题所涉及的字符串并不局限于此。 赵迪(Zaoly)对此非常感兴趣,想要编写程序判断一个字符串是否为正确的输出嵌套。

题目描述

下面定义字符串 $s$ 的 $\bm n$ **层输出嵌套**($n=0,1,2,\ldots$): 1. $s$ 是 $s$ 的 $0$ 层输出嵌套; 2. 对 $s$ 的 $n$ 层输出嵌套依次进行如下操作,所得字符串是 $s$ 的 $n+1$ 层输出嵌套: 1. 替换所有的 `\` 为 `\\`; 2. 替换所有的换行符为 `\n`; 3. 替换所有的 `"` 为 `\"`; 4. 在最前面添加 `printf("`; 5. 在最后面添加 `");`。 给定一个字符串 $S$,请判断是否存在原字符串 $s$ 和整数 $n$,使得 $S$ 是 $s$ 的 $n$ 层输出嵌套。已知原字符串 $s$ 除最后一个字符外,仅由 ASCII 编码从 $32$ 到 $126$ 之间的字符组成(**除了百分号 `%`**,ASCII 编码为 $37$),且**最后一个字符是换行符**(ASCII 编码为 $10$)。 ### **注意:** 1. 前缀 `printf("` 和后缀 `");` 中的括号、引号和分号不能遗漏; 2. `printf` 中每个字母必须**小写**,`\n` 中的字母也必须**小写**; **(以下条目尤其针对懂 C/C++ 语言的)** 3. 不考虑 C/C++ 语言的多行字符串语法; 4. 不考虑本题未提到的 C/C++ 语言转义字符。

输入格式

**本题包含多组测试数据。** 第一行包含一个整数 $T(1\le T\le20000)$,表示测试数据的组数。 每组测试数据的格式如下: 一行一个字符串 $S$,长度 $l$ 为满足 $1\le l\le2000$ 的整数,每个字符的 ASCII 编码 $a$ 均为满足 $32\le a\le126$ 且 $a\ne37$(对应字符 `%`)的整数,以换行符结束。**末尾换行符忽略**,不算进字符串 $S$ 中。 所有测试数据的字符数总和小于 $10^7$。

输出格式

输出 $T$ 行,每组测试数据输出一行,内容如下: - 如果 $S$ 是某原字符串 $s$ 的 $n$ 层输出嵌套,则为整数 $n$ 的值; - 否则,为“`-1`”。

说明/提示

**【样例解释】** **样例二**:解输出嵌套后所得字符串为(末尾带换行符): ``` Love It! ``` 中间出现换行符,不符合要求。 **样例三**:解输出嵌套后所得字符串仅包含换行符,符合要求。 **样例四**:解输出嵌套后所得字符串为: ``` printf("\t\n"); ``` 其中 `\t` 无法通过输出嵌套变换方法得到,无法继续解输出嵌套。 **样例七**:解输出嵌套后所得字符串为: ``` printf("Nice to meet you!\n); ``` 其中双引号不匹配,无法继续解输出嵌套。 **样例八**:解输出嵌套后所得字符串为(末尾带换行符): ``` printf("Good night!\n"); ``` 因为最后一个字符是换行符,所以不能继续解输出嵌套,只能到此为止。恰巧最后一个字符是换行符,符合原字符串要求。 **样例九**:该字符串无法通过输出嵌套变换方法得到,因为在第 $109$ 个字符处出现了意外的双引号。 --- **【提示】** ASCII 编码从 $32$ 到 $126$ 的字符依次为: ``` !"#$%&'()*+,-./0123456789:;? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ `abcdefghijklmnopqrstuvwxyz{|}~ ```