1459: 信号传输

内存限制:65535 MB 时间限制:1000 S
评测方式:文本比较 命题人:外部导入
提交:194 解决:66

题目描述

给定一个字符串s1,它是由某个字符串s2不断自我连接形成的。但是字符串s2是不确定的,现在只想知道它的最短长度是多少。

输入

第一行一个整数L,表示给出字符串的长度。
第二行给出字符串s1的一个子串,全由小写字母组成。

输出

仅一行,表示s2的最短长度。

样例输入 复制

8
cabcabca

样例输出 复制

3

提示

样例输入输出解释

对于样例,我们可以利用 abc不断自我连接得到 abcabcabc ,读入的 cabcabca 是它的子串。


题目解析:
cabcabca

通过输出 next_[] 数组: -1 0 0 0 1 2 3 4 5

next_[i] = j 表示第 i 位置前最长公共前后缀的长度为 j 。

c 位置最长公共前后缀的长度为 0
a 位置最长公共前后缀的长度为 0
b 位置最长公共前后缀的长度为 0
c 位置最长公共前后缀的长度为 1
a 位置最长公共前后缀的长度为 2
b 位置最长公共前后缀的长度为 3
c 位置最长公共前后缀的长度为 4
a 位置最长公共前后缀的长度为 5

注意:字符串存储是从下标0开始的,所以 :

next_[1] 表示 a 前面的子串 {c} 最长公共前后缀的长度为 0 。
next_[2] 表示 b 前面的子串 {ca} 最长公共前后缀的长度为 0 。
next_[3] 表示 c 前面的子串 {cab} 最长公共前后缀的长度为 0 。
next_[4] 表示 a 前面的子串 {cabc} 最长公共前后缀的长度为 1 。

答案N - next[N] 可以这样理解:

从字符串的某一处开始到串末,和串首到某一处是完全相等的,其中最长的就是最长公共前后缀。