题解:P11276 第一首歌
闲话
本篇题解来自赛场第二切,比@dead_X 慢了整整 。
Pro
给定 ,求一个最短字符串 ,使得 是 的最长 border。
Sol
前置知识:KMP,记号 表示字符串 的长度。
首先我们可以输出这个字符串,因为 是 的 border, 的前缀就一定是 。
接下来考虑后缀怎么为 。
KMP 中,有一个数组叫做 , 表示 的前 个字符的 border。怎么求 详见原题。
因为 的长度不会超过 ,所以 一定有一段前缀会和它的一段后缀重合。
设 是一个类似 QwQ(其实就是的)的结构,那么 一定会构造出一个形如 QwQwQ 的结构。
当 是 的最长 border 时,一定是最优的,因为 再长一定会不符合题意,再短一定不优。
所以求出 的 数组,输出 以及 从 到 的所有字符。
时间复杂度 。
Code
仅展示核心代码。
b=" "+b;
kmp(b);
for(int i=1;i<=n;i++) cout<<b[i];
for(int i=nxt[n/*n=|s|*/]+1;i<=n;i++) cout<<b[i];
}
后记
@dead_X 我**你*。

浙公网安备 33010602011771号