#P13718. [GCPC 2024] Copycat Catcher

[GCPC 2024] Copycat Catcher

Description

你所在的大学最近成立了“研究生代码抄袭控制(GCPC)”项目,以应对计算机科学作业批改者日益增长的工作量。目前,批改者需要人工检查作业代码是否存在抄袭。GCPC 的目标是通过自动执行抄袭检查,简化批改者的这部分工作。

:::align{center} 一个抄袭检测键盘 :::

代码由用空格分隔的若干“记号”组成。记号是由字母、数字和括号组成的字符串。如果一个记号仅由单个字母(大小写均可)组成,则它是代码中的变量。

GCPC 希望抄袭检测器能够将查询代码片段与参考代码进行比较。具体来说,它应当检查每个查询是否可以通过从参考代码中选取一段连续的记号,并对变量进行一致性重命名后得到。

变量的一致性重命名指:同一个变量的所有出现都被重命名为同一个变量,并且不同的变量不会被重命名为同一个变量。

GCPC 要求你开发这个抄袭检测器。

Input Format

输入包括:

  • 参考代码的描述,包括:
    • 一行一个整数 nn1n20001\leq n \leq 2000),表示参考代码中的记号数。
    • 一行包含 nn 个记号,每个记号仅由字符 'a\texttt{a}'-'z\texttt{z}'、'A\texttt{A}'-'Z\texttt{Z}'、'0\texttt{0}'-'9\texttt{9}'、'(\texttt{(}' 和 ')\texttt{)}' 组成。
  • 一个整数 qq1q20001 \leq q \leq 2000),表示查询次数。
  • 接下来 2q2\cdot q 行,每两行为一组,格式与参考代码相同,分别表示每个查询的记号数和记号内容。

保证每个查询和参考代码的总字符数(不包括空格)均不超过 20002000。记号之间用单个空格分隔。

Output Format

对于每个查询,如果该查询可以通过从参考代码中选取一段连续的记号并对变量进行一致性重命名得到,则输出“yes”,否则输出“no”。

9
for i in range(10) do print i j end
4
3
print j i
2
do print
6
k in range(10) do print k
6
k in range(10) do print j
yes
yes
yes
no

5
i is i times j
7
5
i is i times j
5
a is a times b
5
j is j times c
5
a is i times j
5
j is i times j
5
0 is 0 times j
5
i is i times i

yes
yes
yes
no
no
no
no

5
A 1 ( ) b
4
2
b 2
2
b 1
3
1 ) (
5
a 1 ( ) F

no
yes
no
yes

Hint

由 ChatGPT 4.1 翻译