题意

中文题,不解释

题解

这道题正解应该是回文树,不过用Manacher算法8s水过了。首先用Manacher算法算出来P数组,然后将所有的P数组-1,这样的话便能得到以某一个位置为中心的回文串最长长度。然后我们可以根据这个长度为两个端点赋值。dp1[i]代表从i-1开始向前的最长回文子串,dp2[i]代表从i+1开始最长回文子串。我们可以在i这个位置,得到(dp2[i-p[j]],dp1[i+p[j]])。最后我们可以从1开始遍历,寻找在哪个位置前后回文子串组成的子串长度最长。(当然,有人可能会疑惑这样搞会不会产生一些问题,因为我们可以发现这样组成的串是不包含I的。如果仔细想一下就会发现,这样是没有任何问题的。因为题目要求最长子串,所以最长子串一定是在’#’处得到,不会产生任何问题)

代码

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<string>
#include<set>
#include<map>
#include<bitset>
#include<stack>
#include<string>
#define UP(i,l,h) for(int i=l;i<h;i++)
#define DOWN(i,h,l) for(int i=h-1;i>=l;i--)
#define W(a) while(a)
#define MEM(a,b) memset(a,b,sizeof(a))
#define LL long long
#define INF 0x3f3f3f3f3f3f3f3f
#define MAXN 120050
#define MOD 1000000007
#define EPS 1e-3
using namespace std;
char s[120010],ts[220010];
int p[220010];
int dp1[220010],dp2[220010];void solve() {MEM(p,0);MEM(dp1,0);MEM(dp2,0);int n=strlen(s);int pos=0;ts[pos++]='$';ts[pos++]='#';UP(i,0,n) {ts[pos++]=s[i];ts[pos++]='#';}ts[pos]='\0';int mx=0,id;UP(i,1,pos) {if(mx>i) p[i]=min(p[id*2-i],mx-i);else p[i]=1;W(ts[i+p[i]]==ts[i-p[i]]) p[i]++;if(i+p[i]>mx) {mx=i+p[i];id=i;}}UP(i,1,pos) p[i]--;UP(i,1,pos){DOWN(j,p[i]+1,1){if(i+j>=pos) continue;if(dp1[i+j]>=j) break;dp1[i+j]=j;}DOWN(j,p[i]+1,1){if(i-j<=0) continue;if(dp2[i-j]>=j) break;dp2[i-j]=j;}}int ans=-INF;UP(i,1,pos){if(dp1[i]&&dp2[i]) ans=max(ans,dp1[i]+dp2[i]);
//        cout<<i<<" "<<dp1[i]<<" "<<dp2[i]<<endl;}printf("%d\n",ans);
}int main() {W(~scanf("%s",s)) {solve();}
}

HYSBZ 2565 Manacher算法相关推荐

  1. manacher算法----O(n)最长回文串

    manacher算法----O(n)最长回文串 分类:字符串 (126)  (0)  举报  收藏 manacher的时间复杂度为O(n),后缀数组好像可以处理O(nlogn),但是有些变态题目可能卡 ...

  2. 谈谈我对Manacher算法的理解

    Manacher算法其实是求字符串里面最长的回文. ①在学习该算法前,我们应该知道回文的定义:顺序读取回文和逆序读取回文得到的结果是一样的,如:abba,aba. 那么我们不难想到,在判断一个字符串s ...

  3. 【字符串】manacher算法

    Definition 定义一个回文串为从字符串两侧向中心扫描时,左右指针指向得字符始终相同的字符串. 使用manacher算法可以在线性时间内求解出一个字符串的最长回文子串. Solution 考虑回 ...

  4. Manacher算法 , 实例 详解 . NYOJ 最长回文

    51 Nod http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 Manacher 算法 定义数组 p[i]表示以i为 ...

  5. (回文串)Manacher算法

    (回文串)Manacher算法 标签: ACM 回文串 Manacher 问题描述: 输入一个字符串,求出其中最大的回文子串.子串的含义是:在原串中连续出现的字符串片段.回文的含义是:正着看和倒着看相 ...

  6. 通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)

    1. 回文串 作为程序员,回文串这个词已经见怪不怪了,就是一个字符串正着读和反着读是一样的,形式如abcdcba.bbaabb.这里涉及到奇回文和偶回文,奇回文指回文串的字符数是奇数,偶回文指回文串的 ...

  7. hdu 3068 最长回文(manacher算法)

    最长回文                                                                         Time Limit: 4000/2000 M ...

  8. Manacher 算法模板

    简介 在字符串的题目中,有时会遇上 回文串 这样一个名词 顾名思义,回文串 就是 正读和反读都一样的字符串 而 最长回文子串 ,就是在一个字符串的所有子串中,是回文串且长度最长的那个 求最长回文子串最 ...

  9. P3805 【模版】manacher算法(manacher)

    P3805 [模版]manacher算法 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a ...

最新文章

  1. 根据一个大图片自动生成相应小图片的代码
  2. 微信红包要哭了...给抢红包设计一个新交互
  3. Oracle把逗号分割的字符串转换为可放入in的条件语句的字符数列
  4. GitHub 开源跨平台神器 Electron 实践 | 技术头条
  5. 生意参谋指数转化算法(2021最新)
  6. 上海市青少年算法2022年6月月赛(丙组)
  7. 【关于c/c++中开平方函数sqrt()的用法】
  8. 泡泡龙游戏开发系列教程(二)
  9. linux查找外接摄像头端口
  10. 林信良(良葛格)在CSDN上也开专栏了~
  11. 【SpringBoot】SpringBoot更改项目编码集
  12. Windows下Ubuntu子系统,开启复制粘贴功能方法
  13. 在centos8环境下用asterisk18配置pjsip和webrtc音视频通话教程(一)
  14. 计算机二级的Word知识点,计算机二级word知识点「干货」
  15. android----Android语音播报的两种简单实现
  16. php预览ppt,演示文稿幻灯片有哪四种视图模式?
  17. JS 开启 win10 触屏键盘
  18. android 微信签名,Android微信签名知识的总结
  19. Scipy库(win下安装)
  20. IntelliJ IDEA V2022.1版本亮点——改进框架与技术

热门文章

  1. 【Python实战】听书就用它了:海量资源随便听,内含几w书源,绝对精品哦~(好消息好消息)
  2. 网络路由与交换技术常见命令1(Cisco)
  3. STM32模拟读卡器,对于工控机方案谨防踩坑
  4. 笔记-项目干系人管理-控制干系人参与
  5. 使用IO完善快递管理系统
  6. 前端:使用BootStrap搭建一个简单的网页
  7. 杭电2019多校第三场 HDU-6608 Fansblog(威尔逊定理+大数判素数+逆元)
  8. python语言中整数1010的二进制是多少_10的二进制是多少哦啊?怎么算 O(∩_∩)O谢谢?...
  9. 云台山风景区茶园骑共享单车,游玩茶园的每一个角落
  10. 客户订单管理系统使用教程