#CF1721E. 前缀函数查询

前缀函数查询

前缀函数查询

  • 时间限制:2 秒
  • 内存限制:256 MiB

题目描述

给定一个由小写拉丁字母组成的字符串 ss。

你将会收到 qq 个关于它的询问:对于每个给定的由小写拉丁字母组成的字符串 tt,请执行以下操作:

  1. 将 ss 和 tt 连接起来;
  2. 计算连接后字符串 s+ts+t 的前缀函数;
  3. 输出前缀函数在位置 ∣s∣+1,∣s∣+2,…,∣s∣+∣t∣|s|+1, |s|+2, \dots, |s|+|t| 上的值(∣s∣|s| 和 ∣t∣|t| 分别表示字符串 ss 和 tt 的长度);
  4. 将字符串还原为 ss。

字符串 aa 的前缀函数是一个序列 p1,p2,…,p∣a∣p_1, p_2, \dots, p_{|a|},其中 pip_i 表示最大的 kk,使得 k<ik < i 且 a[1..k]=a[i−k+1..i]a[1..k]=a[i-k+1..i](a[l..r]a[l..r] 表示字符串 aa 从第 ll 个字符到第 rr 个字符的连续子串,包含两端)。换句话说,就是 a[1..i]a[1..i] 的最长真前缀,且该前缀等于其后缀。

输入格式

第一行包含一个非空字符串 ss(1≤∣s∣≤1061 \le |s| \le 10^6),由小写拉丁字母组成。

第二行包含一个整数 qq(1≤q≤1051 \le q \le 10^5),表示询问的数量。

接下来的 qq 行,每行包含一个非空字符串 tt(1≤∣t∣≤101 \le |t| \le 10),由小写拉丁字母组成。

输出格式

对于每个询问,输出字符串 s+ts+t 的前缀函数在位置 ∣s∣+1,∣s∣+2,…,∣s∣+∣t∣|s|+1, |s|+2, \dots, |s|+|t| 上的值。

样例输入 1

aba
6
caba
aba
bababa
aaaa
b
forces

样例输出 1

0 1 2 3 
1 2 3 
2 3 4 5 6 7 
1 1 1 1 
2 
0 0 0 0 0 0

样例输入 2

aacba
4
aaca
cbbb
aab
ccaca

样例输出 2

2 2 3 1 
0 0 0 0 
2 2 0 
0 0 1 0 1

数据范围

子任务编号 分值 特殊限制
1 20 ∣s∣≤50\lvert s\rvert\le 50,q≤20q\le 20
2 40 ∣s∣≤5000\lvert s\rvert\le 5000,q≤200q\le 200
3 无特殊限制