洛谷 P11276 第一首歌
题解:P11276 第一首歌
题意
这道题需要我们找到一个最短的字符串,使得给定的字符串既是它的前缀也是它的后缀。
KMP算法
用 pi[i]
表示字符串 s[0:i]
的最长的即是前缀又是后缀的子串的长度,那么 pi[n-1]
就是整个字符串最长的即是前缀又是后缀的字串的长度,也就是我们的答案的长度。
假设 k = pi[n-1]
,意味着整个字符串最长的即是前缀又是后缀的字串的长度为 k ,则 s[0:k]
既是s
的前缀也是 s
的后缀,那么我们只需要把 s[0:k]
加上 s.substr(k)
就能得到最小的满足条件的答案
计算pi数组
其中 pi
数组是整个题目的关键所在,我们通过 while
循环不断回到之前的前缀位置,直到匹配或找到最大前缀后缀,具体见代码。
代码
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Qianmo's Blog!