算法随笔——manacher
manacher
求最长回文子串
暴力
枚举回文中心
可以用二分哈希优化至
算法思路
当求解第
于是引入
因此
小tips
因为回文串有奇有偶,因此为了避免讨论,在每个字符之前和首尾插入一个 '#',可以保证每个回文串长度均是奇数,答案即为
char old[N],str[N];
int p[N],r,m;
int main()
{
scanf("%s",old+1);
int len = 0;
//插入字符 初始化
str[++len] = '#';
for (int i = 1,l = strlen(old+1);i <= l;i++)
str[++len] = old[i],str[++len] = '#';
for (int i = 1;i <= len;i++)
{
if (i > r) p[i] = 1;
else p[i] = min(p[2*m-i],r-i+1);
while (i+p[i] <= len && i - p[i] >= 1 &&
str[i+p[i]] == str[i-p[i]]) p[i]++; //暴力拓展
//更新中心和最远右端点
if (i + p[i] - 1 > r) r = i + p[i] - 1,m = i;
}
int ans = 0;
for (int i = 1;i <= len;i++ ) ans = max(p[i],ans);
cout << ans - 1 << endl;
//答案等于(整条回文串-1)/2
//即(p[i]*2-1 -1)/2 = p[i]-1
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)