U639316 最长子串询问

题目描述

给你一个长度为 $n$ 的字符串 $s = s_1 s_2 \ldots s_n$。 接下来有 $m$ 次询问,每次询问给你两个整数 $p$ 和 $q$。 你需要找到一个最长的整数 $z$,满足: - $p+z-1 \le n$ - $q+z-1 \le n$ - 以 $s_p$ 开头的长度为 $z$ 的子串和以 $s_q$ 开头的长度为 $z$ 的子串相同(即 $s[p..p+z-1] = s[q..q+z-1]$) 我们称整数 $z$ 为以 $s_p$ 和 $s_q$ 开头的最长公共子串长度。 特别地,如果 $s_p \neq s_q$,则不存在任何长度为正整数的同时以 $s_p$ 和 $s_q$ 开头的公共子串,则对应的 $z = 0$。

输入格式

第一行,两个整数 $n$ 和 $m$,以空格分隔。 第二行,一个长度为 $n$ 的字符串 $s$。 接下来 $m$ 行,每行包含两个整数 $p$ 和 $q$,以空格分隔,表示一次询问。

输出格式

对于每次询问,输出一行,包含一个整数 $z$,表示同时以 $s_p$ 和 $s_q$ 开头的最长公共子串长度。

说明/提示

#### 数据规模与约定 - 对于 $20\%$ 的数据,$n,m \le 20$ - 对于 $50\%$ 的数据,$n,m \le 2000$ - 对于 $100\%$ 的数据,$2 \le n \le 2 \cdot 10^5$,$1 \le m \le 2 \cdot 10^5$,字符串 $s$ 仅由小写英文字母构成,每次询问的 $p,q$ 满足 $1 \le p \lt q \le n$