前缀
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

牛牛有一个s串,s串仅由26个小写英文字母组成,他现在将s串进行了无限次的复制扩展成了一个无限循环串。
例如一开始s="abc",那么牛牛就会将其变为"abcabcabc..."
若某个字符串保留其原本字符出现的顺序,并且按照顺序取出若干个字符。可以不连续,可以不取。
我们称取出的这若干个字符连成的字符串为一个子序列。
若连续取出某个字符串的前k个字符,组成一个子串,我们称该字符串为原串长度为k的前缀。
对于一个字符串t,若某字符串的至少一个子序列为t。则称它是一个“含t序列串”
牛牛想要知道对于给定的t,他想要知道s的一个最短前缀满足它是一个“含t序列串”,它的长度有多长?
由于答案可能非常大,所以他要求你输出答案对998244353取余数后的结果即可。
特别的,如果S串不存在任何一个前缀满足他是一个“含t序列串”,请输出"-1"表示无解。
t串中除了26个英文字母以外还会出现"*",表示一个通配符。统配符可以视为任意字母。
例如循环s串为"abcabcabcabc...",t串为"a*ca"时,最短含t序列前缀长4。而当t串为"a**ca"时,最短含t序列前缀长7。
除此之外,牛牛输入的t串还可能非常非常长,最长可以达到这么长。
所以他想了一种压缩方法,来快速读入t串。
具体来说,它输入的t串中除了"*"和26个小写英文字母以外,还会跟有一些正整数。
在读入字符串时,这些数字表示它前面字母或者"*"重复的次数。
例如a5bc*3,表示"aaaaabc***"。输入的正整数不含前导0。

输入描述:

第一行输入一个仅包含26个小写英文字母的字符串s
第二行输入一个正整数n表示,t串的数目。
接下来输入n行
再输入一行一个字符串t,表示压缩后的查询串。查询串仅包含26个小写英文字母,星号'*',以及数字。

输出描述:

对于每一个查询,如果至少存在一个s的前缀满足“最短含t序列串”的定义,请输出s的最短含t序列前缀的长度对998244353取余数后的结果。

否则请输出"-1"表示无解。

示例1

输入

复制
abc
3
a*ca
a**ca
a*2ca

输出

复制
4
7
7

说明

S串为:abcabcabcabcabc....
包含a*ca作为子序列的最短前缀为abca。
包含a**ca作为子序列的最短前缀为abcabca。
a*2ca表述的T串和a**ca等价。
示例2

输入

复制
nowcoder
2
o1000000000000000000000000000000000000000000000000000000000000
winterzz1

输出

复制
110162207
-1

说明

最短含t前缀长度为3999999999999999999999999999999999999999999999999999999999997,该数对998244353取余数的结果为110162207

备注:

对于前的测试数据保证且t串中不包含数字以及'*'。
对于前的测试数据保证且t串中不包含数字。
对于前的测试数据保证且t串中不包含数字。
对于前的测试数据保证且t串中的数字值域范围在内。
对于前的测试数据保证且t串中的数字值域范围在内。
注意,|t|仅表示输入时的压缩串的长度,不代表解压缩后的长度,解压后t串的长度最长可以达到