Evanyou Blog 彩带

洛谷P3805 [模板]Manacher算法 [manacher]

  题目传送门

  

题目描述

给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.

字符串长度为n

输入输出格式

输入格式:

 

一行小写英文字符a,b,c...y,z组成的字符串S

 

输出格式:

 

一个整数表示答案

 

输入输出样例

输入样例#1:
  1. aaa
输出样例#1:
  1. 3

说明

字符串长度len <= 11000000

 


 

 

  分析:manacher算法模板,算法分析就不具体讲了,five20大佬讲的挺好的,可以参照一下他的博客

  Code:

  

复制代码
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=2e7+3e6+7;
  4. char s[N],neo[N];int p[N];
  5. int change()
  6. {
  7. int len=strlen(s);
  8. int ret=0;neo[ret++]='$';
  9. for(int i=0;i<len;i++)
  10. neo[ret++]='#',neo[ret++]=s[i];
  11. neo[ret++]='#';neo[++ret]='\0';return ret;
  12. }
  13. int manacher()
  14. {
  15. int len=change();
  16. int ans=-N,id,mx=0;
  17. for(int i=1;i<=len;i++){
  18. if(i<mx)p[i]=min(p[id*2-i],mx-i);
  19. else p[i]=1;
  20. while(neo[i-p[i]]==neo[i+p[i]])p[i]++;
  21. ans=max(ans,p[i]-1);
  22. if(i+p[i]>mx)id=i,mx=i+p[i];
  23. }
  24. return ans;
  25. }
  26. int main()
  27. {
  28. scanf("%s",s);
  29. printf("%d",manacher());
  30. return 0;
  31. }
复制代码

 

posted @   HolseLee  阅读(216)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示