#P14675. [2023 Regional]common

    ID: 13891 传统题 2000ms 512MiB 尝试: 1 已通过: 1 难度: 7 上传者: 标签>CF2300字符串后缀自动机二分字符串哈希

[2023 Regional]common

题目描述

今天我们来解决经典的最长公共子串问题,但这里有两个额外条件:

  1. 字符串是循环的;
  2. 在某些情况下,我们要在两个以上字符串之间寻找最长公共子串。

更形式化地说,给定一组循环字符串 {s1,,sk}\{s_1,\dots,s_k\},每个字符串长度均为 nn

若存在一对下标 1i,jt1\le i,j\le |t|,使得 t(i,j)=pt(i,j)=p,则称字符串 pp 是循环字符串 tt 的一个子串。在本题中,我们要找到一个最长的字符串 pp,使得它同时是所有循环字符串 {s1,,sk}\{s_1,\dots,s_k\} 的子串。

在上述定义中,t|t| 表示字符串 tt 的长度;t(i,j)t(i,j) 表示从位置 ii 开始、到位置 jj 结束的子串。当 i>ji>j 时,允许从字符串末尾绕回开头。也就是说:

  • iji\le j 时,t(i,j)=titi+1tjt(i,j)=t_i t_{i+1}\dots t_j
  • i>ji>j 时,t(i,j)=titi+1ttt1t2tjt(i,j)=t_i t_{i+1}\dots t_{|t|} t_1 t_2\dots t_j

请编写程序 common,在给定 kk 个循环字符串后,求出它们的最长公共子串的长度。

注意:只有最初给定的字符串是循环的,我们要找的公共子串本身并不是循环串

输入格式

第一行输入两个整数 nnkk,分别表示每个字符串的长度以及字符串个数。

接下来 kk 行,每行一个仅由小写拉丁字母组成的字符串。

输出格式

输出一个整数,表示最长公共子串的长度。

数据范围

  • 1n1000001\le n\le 100000
  • 2k102\le k\le 10

子任务

子任务 分值 nn kk
1 10 50\le 50 =2=2
2 25 100\le 100
3 15 500\le 500
4 -
5 25 40000\le 40000
6 10 -

只有当某个子任务的所有测试全部通过时,才能获得该子任务的分数。

样例 #1

输入 #1

5 2
fabcq
bcdda

输出 #1

3

说明 #1

最长公共子串是 abc

fabcq
bcdda