#P8368. [LNOI2022] 串

    ID: 9463 远端评测题 1000ms 512MiB 尝试: 0 已通过: 0 显示难度NOI/NOI+/CTS 上传者: 标签>各省省选2022后缀自动机 SAMO2优化辽宁后缀数组 SA

[LNOI2022] 串

题目描述

为了让你更好地理解题面,给出若干关于字符串的定义:

  • 对于一个字符串 S=s1s2⋯snS = s_1 s_2 \cdots s_n,定义其长度为 ∣S∣=n\lvert S \rvert = n。
  • 对于两个字符串 S=s1s2⋯snS = s_1 s_2 \cdots s_n 和 T=t1t2⋯tmT = t_1 t_2 \cdots t_m,称 TT 为 SS 的子串,若 m=0m = 0(即 TT 为空串)或者 ∃1≤i≤j≤n\exists 1 \le i \le j \le n,T=sisi+1⋯sjT = s_i s_{i + 1} \cdots s_j。若 m=0m = 0 或上述判断条件中 ii 可以取到 11,则称 TT 为 SS 的前缀;若 m=0m = 0 或上述判断条件中 jj 可以取到 nn,则称 TT 为 SS 的后缀。

给定一个英文小写字母构成的字符串 SS,你需要找到一个尽可能长的字符串序列 (T0,T1,…,Tl)(T_0, T_1, \ldots, T_l),满足:

  • T0T_0 是 SS 的子串;
  • ∀1≤i≤l\forall 1 \le i \le l,∣Ti∣−∣Ti−1∣=1\lvert T_i \rvert - \lvert T_{i - 1} \rvert = 1;
  • ∀1≤i≤l\forall 1 \le i \le l,存在 SS 的一个长度为 ∣Ti∣+1\lvert T_i \rvert + 1 的子串 Si′S'_i,使得 Si′S'_i 的长度为 ∣Ti−1∣\lvert T_{i - 1} \rvert 的前缀为 Ti−1T_{i - 1},长度为 ∣Ti∣\lvert T_i \rvert 的后缀为 TiT_i。

输出这样的字符串序列的长度的最大值(即 ll 的最大值)。

输入格式

本题有多组测试数据。输入的第一行为一个整数 TT,表示测试数据组数。对于每组测试数据,输入一行一个英文小写字母构成的字符串 SS。

输出格式

对于每组测试数据输出一行一个整数,表示题目描述中字符串序列长度的最大值。

3
abcd
abab
a

2
3
0

提示

【样例解释 #1】

下文中使用符号 ϵ\epsilon 表示空串。

对于第一组测试数据,可以找到如下字符串序列:$T_0 = \epsilon, T_1 = \texttt{b}, T_2 = \texttt{cd}$,其中 S1′=ab,S2′=bcdS'_1 = \texttt{ab}, S'_2 = \texttt{bcd}。

对于第二组测试数据,可以找到如下字符串序列:$T_0 = \epsilon, T_1 = \texttt{b}, T_2 = \texttt{ab}, T_3 = \texttt{bab}$,其中 $S'_1 = \texttt{ab}, S'_2 = \texttt{bab}, S'_3 = \texttt{abab}$。

对于第三组测试数据,可以找到如下字符串序列:T0=ϵT_0 = \epsilon。

【样例 #2】

见附件中的 string/string2.in 与 string/string2.ans。

该组样例中的字符串长度有一定梯度,你可以利用该组样例对程序进行检查。

【样例 #3】

见附件中的 string/string3.in 与 string/string3.ans。

该组样例满足特殊性质 A。

【数据范围】

设 ∑∣S∣\sum |S| 表示测试点中所有测试数据的字符串长度和。

对于 100%100 \% 的测试数据,T≥1T \ge 1,1≤∣S∣≤5×1051 \le \lvert S \rvert \le 5 \times {10}^5,1≤∑∣S∣≤1.5×1061 \le \sum \lvert S \rvert \le 1.5 \times {10}^6。

测试点编号 ∣S∣≤\lvert S \rvert \le ∑∣S∣≤\sum \lvert S \rvert \le 特殊性质
1∼21 \sim 2 3030 150150 无
3∼53 \sim 5 200200 800800
6∼86 \sim 8 10001000 30003000
9∼119 \sim 11 5×1055 \times {10}^5 1.5×1061.5 \times {10}^6 A
12∼1512 \sim 15 6×1046 \times {10}^4 3×1053 \times {10}^5 无
16∼2016 \sim 20 5×1055 \times {10}^5 1.5×1061.5 \times {10}^6

特殊性质 A:字符串中的每个字符在小写字母中独立均匀随机生成。

【提示】

本题输入输出量较大,请使用较为快速的输入输出方式。

例如,若你的代码使用了 cin 和 cout 作为输入输出方式,你可以选择在代码的输入输出重定向语句(freopen 语句、 fopen 语句等)之后加入以下语句加速输入输出速度。

ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

加入该语句后不建议同时使用 cin, cout 和其他输入输出方式。