parent 树上启发式合并
题号:NC274852
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 32 M,其他语言64 M
64bit IO Format: %lld

题目描述

LH 拿到了一个字符串 S,他想要和你玩个游戏,每次 LH 询问你一个字符串 T,和一个整数 k,你需要回答,字符串 TS 中从左到右出现第 k 次的位置在哪。

假如 S[l\sim r]=T,那么字符串 T 在位置 r 出现。

字符串中只可能出现小写英文字母,大写英文字母和阿拉伯数字。

输入描述:

第一行输入两个整数 n(1\le n\le 10^5),q(1\le q\le 10^5),分别表示 S 的长度和询问次数。

第二行包含一个字符串 S

随后 q 行,每行包含一个字符串 T 和一个正整数 k(1\le k\le 10^5)

保证所有询问的不同的字符串 T 的长度和不超过 10^4

保证所有询问的字符串 T 的长度和不超过 10^5

字符串可能包含英文小写字母,英文大写字母,数字。

提示:请注意不寻常的内存限制。

输出描述:

对于每个询问,输出 TS 中出现第 k 次的下标,假如 TS 中的出现次数少于 k 次,请输出 -1
示例1

输入

复制
10 5
abcabC8dab
ab 3
abc 1
e 1
b 2
abced 2

输出

复制
10
3
-1
5
-1