#HK5390. 「OOI 2021 Day 2」插入文本

「OOI 2021 Day 2」插入文本

题目描述

题目译自 Open Olympiad in Informatics 2021 Day2 T2 「Вставить текст」。

阿里萨和安娅是文案工作者。最近她们接到一个订单:需要编写 kk 个关于相似主题的文本(字符串)。她们迅速开始工作,得到了 kk 个字符串 S1,…,SkS_1, \dotsc, S_k,每个字符串的长度不超过 mm,且由小写拉丁字母组成,其中 S1S_1 的长度恰好为 mm。

她们长期合作,有一个简单的方法来检查工作的原创性。原创性通过检查文本的子串来评估。阿里萨和安娅认为某个字符串是非原创的,如果它及其反转后的字符串在她们的文本中作为子串出现在相同的位置上。

为了加快检查速度,她们将字符串分割成块。分割成 tt 个块由序列 a0,a1,…,ata_0, a_1, \dotsc, a_t 定义,其中 a0=0a_0 = 0,at=ma_t = m,且对于任意 1≤i≤t1 \leq i \leq t,ai−1<aia_{i-1} < a_i。第 ii 个块定义为整数区间 [ai−1+1;ai][a_{i-1}+1; a_i]。块 [ai−1+1;ai][a_{i-1}+1; a_i] 被称为有趣的,如果存在一个非原创字符串,恰好在该块定义的位置上出现在文本中。换句话说,块是有趣的,如果存在字符串 SlS_l 和 SrS_r(可能 l=rl = r),使得 ∣Sl∣,∣Sr∣≥ai|S_l|, |S_r| \geq a_i,且字符串 Sl,ai−1+1Sl,ai−1+2…Sl,aiS_{l, a_{i-1}+1}S_{l, a_{i-1}+2}\dotsc S_{l, a_i} 与字符串 Sr,aiSr,ai−1…Sr,ai−1+1S_{r, a_i}S_{r, a_i-1}\dotsc S_{r, a_{i-1}+1} 相同,其中 St,jS_{t,j} 是字符串 StS_t 的第 jj 个字符。

例如,对于文本 [abba,ba][\texttt{abba}, \texttt{ba}],序列 (0,1,4)(0,1,4) 和 (0,1,2,3,4)(0,1,2,3,4) 定义了有效的分割,而 (1,2,3)(1,2,3) 和 (0,1,1,4)(0,1,1,4) 则不是。对于分割 (0,2,4)(0,2,4),第一个块 [1;2][1;2] 是有趣的,因为 S1,1S1,2=S2,2S2,1=S_{1,1}S_{1,2}=S_{2,2}S_{2,1}= ab\texttt{ab},而第二个块 [3;4][3;4] 不是有趣的,因为对于唯一可能的对 l=r=1l = r = 1,S1,3S1,4=baS_{1,3}S_{1,4}=\texttt{ba} 和 S1,4S1,3=abS_{1,4}S_{1,3}=\texttt{ab} 不相同。

分割被称为有趣的,如果其中的每个块都是有趣的。阿里萨和安娅希望找到将文本分割成最少块的有趣分割,以衡量工作的原创性。她们努力使这个问题符合现代标准并通过贝克德尔测试,现在请帮助她们编写一个程序来衡量原创性!

请注意,目标值是明确定义的,因为将字符串分割成 mm 个长度为 11 的块总是能得到一个有趣的分割(每个块中可以选择 l=r=1l = r = 1)。

输入格式

第一行包含三个整数 t,k,mt, k, m (1≤k≤200000,1≤m≤500000)(1 \leq k \leq 200000, 1 \leq m \leq 500000),分别表示子任务编号、文本总数和第一个文本的长度。

接下来的 kk 行中,第 ii 行输入 SiS_i,即第 ii 个文本,由小写拉丁字母组成。

保证 ∣S1∣=m|S_1|=m,对于任意 i>1i>1,∣Si∣≤m|S_i| \leq m,且所有字符串的总长度不超过 500000500000。

输出格式

第一行输出一个整数 tt,表示有趣分割中最少的块数。

第二行通过空格分隔输出 t−1t-1 个递增的整数 a1,…,at−1a_1, \dotsc, a_{t-1},表示除最后一个块外的所有块的右边界编号(分割本身为 [1;a1],[a1+1;a2],…,[at−1+1;m][1;a_1], [a_1+1;a_2], \ldots ,[a_{t-1}+1;m])。

0 2 6
abcded
cba

2
3

在第一个样例中,第二个字符串 cba\texttt{cba} 反转后与第一个字符串 abcded\texttt{abcded} 的前三个字符相同。而剩余的字符 ded\texttt{ded} 形成回文,即该字符串与自身反转后相同。因此,我们可以将字符串分割成两个块 [1;3][1;3] 和 [4;6][4;6]。显然,无法分割成更少的块,因为 abcded\texttt{abcded} 不是回文。

0 6 7
poggers
sus
amogus
tokyo
ghoul
sodluv

4
3 5 6

在第二个样例中,第一个块 [1;3][1;3] 可以选择回文字符串 sus\texttt{sus},第二个块选择第五个字符串的一部分 ghoul\texttt{gho}\textbf{ul} 和第六个字符串的一部分 sodluv\texttt{sod}\textbf{lu}\texttt{v},它们反转后彼此相同。第三个和第四个块则从任意字符串中选择单个字母。可以证明,无法分割成更少的块。

数据范围与提示

详细子任务附加限制及分值如下表所示。其中子任务 00 是样例。

子任务 分值 附加限制 子任务依赖 备注
11 77 k≤100k \leq 100,m≤10m \leq 10,L≤1000L \leq 1000 00
22 88 k≤20k \leq 20,m≤100m \leq 100,L≤2000L \leq 2000 00
33 1010 k≤200k \leq 200,m≤200m \leq 200,L≤40000L \leq 40000 0∼20 \sim 2
44 1212 k≤200k \leq 200,m≤2000m \leq 2000,L≤400000L \leq 400000 0∼30 \sim 3
55 99 保证答案中不超过两个块
66 1111 k=1k = 1,m≤50000m \leq 50000,L≤50000L \leq 50000
77 1111 k=1k = 1 66
88 1010 k=2k = 2
99 99 m≤200000m \leq 200000,L≤200000L \leq 200000 0∼3,60 \sim 3, 6
1010 1313 0∼90 \sim 9