本题要求:给定整数数组 a 与若干字符串 s,判断 s 能否与 a 建立一一对应(双射) 的位置映射:相同数字对应相同字符,且相同字符对应相同数字,并且长度相等。
核心做法:把序列按首次出现顺序压缩成模式串。
a:从左到右,第一次见到某个值就分配一个新的编号 0,1,2,...,形成模式序列 patA。s:同样按字符的首次出现分配编号,得到 patS。|s| != n 直接否;否则比较 patS 与 patA 是否完全相同,相同则存在双射,对应输出 YES,否则 NO。该方法天然保证了“双向一致”:
小Q在路上捡到了一张字条,上面写了一个数组 a 。小Q猜测这些数字可能是某种凯撒密码,于是他找来了一堆字符串,请你判断他找来的字符串能否匹配字条上的数字模板?
当字符串 s 同时满足以下所有条件时,视为匹配模板:
字符串 s 的长度等于数组 a 的元素数量。
数组 a 中相同的数字对应字符串 s 中相同的字符。即,若 ai=aj ,则 si=sj(1<=i,j<=n)
字符串 s 中相同的字符对应数组 a 中相同的数字。即,若 si=sj,则 ai=aj(1≤i,j≤n).
换句话说,字符串的字符与数组元素之间必须存在对应关系。
例如,若 a=[3,5,2,1,3],则字符串“abfda”匹配模板,而“afbfa”不匹配,因为字符“f” 对应数字 1 和 5 .
单个测试用例包含多组数据,第一行输入一个整数 t(1<=t<=105) ,表示数据的数量.对于每组数据:
第一行包含一个整数 n(1<=n<=2•105),表示数组 a 的元素数量.
第二行包含恰好 n 个整数ai(−109≤ai≤109) 表示数组 a 的元素。
第三行包含一个整数 m(1≤m≤2•105),表示需要检查的字符串数量。
接下来 m 行,每行包含一个非空字符串 sj(1≤∣sj∣≤2•105) ,由小写字母组成。
保证所有测试用例的 n 之和不超过 2•105,所有字符串长度之和不超过 2•105 .
每个测试用例输出 m 行。如果第 1 个字符串匹配模板,第 i 行输出 YES ,否则输出 NO (注意输出为大写)。
**输入
3
5
3 5 2 1 3
2
abfda
afbfa
2
1 2
3
ab
abc
aa
4
5 -3 5 -3
4
aaaa
bcbc
aba
cbcb
输出
YES
NO
YES
NO
NO
NO
YES
NO
YES