#P13772. [CERC 2021] Repetitions

[CERC 2021] Repetitions

Description

Bob 是一位有抱负的先锋派作家。他鄙视空格、标点符号、大写字母等的使用,因此他的故事只是一长串英文小写字母。评论家们还注意到,他的风格中有一种对重复的偏爱,也就是说,有时会出现同一个子串在他的故事中连续出现两次,中间没有其他字符插入。

Bob 向 qq 家不同的文学杂志投稿了他最新的杰作,这是一串长度为 nn 的字符串,希望至少有一家愿意发表。结果比他预想的还要好,所有 qq 家杂志的编辑都表示愿意发表他故事的一部分(即某个子串),但前提是他需要找出该部分中最长的重复(即某个较短的子串连续出现两次)。编辑们打算删除这部分,以避免故事过于无聊。现在 Bob 需要你的帮助来回答编辑们的这些问题。

请编写一个程序,给定一个长度为 nn 的字符串 s[1]s[2]s[n]s[1]s[2]\ldots s[n],回答 qq 个查询。每个查询形式为“给定 aia_ibib_i,在 s[ai]s[ai+1]s[bi]s[a_i]s[a_i+1]\ldots s[b_i] 这个子串中,最长的字符串 tt 使得 tttt 作为子串出现的长度是多少?最左边的这样一个重复从哪里开始?”

Input Format

第一行包含两个整数 nnqq
第二行包含长度为 nn 的字符串 ss,所有字符均为英文小写字母。
接下来的 qq 行描述每个查询,第 ii 行包含两个整数 aia_ibib_i,用空格分隔。

Output Format

输出 qq 行,每行包含两个用空格分隔的整数 i\ell_icic_ii\ell_i 表示在 s[ai]s[ai+1]s[bi]s[a_i]s[a_i+1]\ldots s[b_i] 中,最长的字符串 tt 使得 tttt 作为子串出现的长度,cic_i 表示最左边的这样一个重复的起始位置,即最小的整数满足 aicia_i \leq c_ici+2i1bic_i + 2\ell_i - 1 \leq b_i 且 $s[c_i]\ldots s[c_i+\ell_i-1] = s[c_i+\ell_i]\ldots s[c_i+2\ell_i-1]$。如果 i=0\ell_i = 0,则定义 ci=aic_i = a_i

10 4
cabaabaaca
4 8
1 9
5 9
8 10
1 4
3 2
1 7
0 8

Hint

说明

上面示例中的四个查询分别对应子串 aabaa\textbf{\underline{a}abaa}cabaabaac\textbf{c\underline{aba}abaac}abaac\textbf{ab\underline{a}ac}aca\textbf{aca};加粗部分是该查询结果所指的子串(长度为 i\ell_i,起始于 cic_i)。在最后一个查询中没有重复,因此 4=0\ell_4 = 0

输入范围

  • 1n1061 \leq n \leq 10^6
  • 1q1001 \leq q \leq 100
  • 对于每个 i=1,2,,qi = 1, 2, \ldots, q1aibin1 \leq a_i \leq b_i \leq n

由 ChatGPT 4.1 翻译