[SHOI2011]双倍回文 题解
1.AGC0552.CF1838A-Blackboard-List3.P7959 [COCI2014-2015#6] WTF 题解4.CF437E The Child and Polygon5.无所畏惧的求和题解6.[ROI 2018] Innophone 题解
7.[SHOI2011]双倍回文 题解
8.2023-02-02 比赛试题及题解9.AGC04310.AGC03311.「TAOI-2」Ciallo~(∠・ω< )⌒★ 题解12.CF题解合集13.CF98C Help Greg the Dwarf 题解14.恋爱入门教学题解15.[CSP-S2019] 树的重心 题解16.CSP-S2023 题解17.CSP-S2019 题解18.CSP-S2019 江西 题解19.YNOI 做题记20.NOIP2022 题解21.CF1900D - Small GCD 题解22.杂题记录[SHOI2011]双倍回文 题解
看了一些写回文自动机的大佬的代码,我深感敬畏,于是我转身向Manacher走去
现在荣登最优解第一页……
说实话,这个方法的复杂度是很玄学的,但是加了一些优化之后,就几乎不可能被卡到 了。
具体思路如下:
预处理字符串部分就略过吧
- 我们预先跑一次 Manacher 算法,考虑到我们其实只需要偶数的回文串的信息,所以将步长设为 2 就行了。
int M(0), R(0), p;
for (int i(1); i < n; i += 2) {
p = R > i ? min(R - i + 1, P[(M<<1) - i]) : 1;
while (s[i + p] == s[i - p]) ++p; // 向两边扩展
if (i + p - 1 > R) M = i, R = i + p - 1; // 更新边界
P[i] = p;
}
-
接着,我们寻找答案。考虑枚举每一个以
i
为中心的偶数回文串。对于这个回文串,我们枚举其回文左区间内的所有点,判断其能否与右区间内对应的区间构成双倍回文即可。换句话来说,假如我们枚举到了j
,那么如果j
是左侧的合法答案,就一定有j + P[j] > i
额,注意一下,这里的
P[i]
指的是回文串的直径,是包括了中间点的元素的。也就是说,回文串所在区间其实是(i - P[i], i + P[i])
(闭区间!)但是,这并不是充要条件。我们考虑这样一种情况
这个时候,
j
其实是不合法的,因为绿色的区间才是合法的区间(合法的区间一定是被i
的回文区间完全包含的!)。所以,对于合法区间的中点,一定在i
的做右区间中点的左边或者右边。那么实际上,我们只需要枚举(i, i + P[i]/2]
作为中点即可。 -
小小的优化:我们需要最大值,所以令答案为
ans
,我们枚举(i + ans, i + P[i]/2]
即可。而且,我们需要的偶数的回文串,所以步长也可以设为 2 来枚举的。
参考代码:
#include <stdio.h>
#define N 1000006
int n, P[N];
char s[N];
inline int min(int x, int y) {
return x < y ? x : y;
}
inline int max(int x, int y) {
return x > y ? x : y;
}
int main() {
scanf("%d", &n);
char tmp;
do tmp = getchar(); while (tmp < 'a');
s[0] = '^', s[1] = '#', s[2] = tmp, s[3] = '#';
for (int i(2); i <= n; ++i) {
s[(i<<1)] = getchar(), s[(i<<1)|1] = '#';
}
// printf("%s\n", s);
int ans(0);
int M(0), R(0), p;
n = (n<<1) + 2;
for (int i(1); i < n; i += 2) {
p = R > i ? min(R - i + 1, P[(M<<1) - i]) : 1;
while (s[i + p] == s[i - p]) ++p; // 向两边扩展
if (i + p - 1 > R) M = i, R = i + p - 1; // 更新边界
P[i] = p;
}
// 寻找答案
for (int i(1); i < n; i += 2) {
int p = P[i] / 2 + 1;
for (int r(ans); r < p; r += 2) {
if (P[i + r] > r && P[i - r] > r) ans = r;
}
}
printf("%d\n", ans + ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App