不会manacher的先去学一下。

首先加入特殊字符,用manacher处理一遍,让pi代表以i为中心的回文串半径(不包括i本身)。

假设某个双回文串的两个回文中心为i、j(i<j)(i,那么有pi+pj>=j-i-1。

化简一下,得到i+pi>=j-pj-1。

经过计算,我们知道,在添加特殊字符的串里面,这个回文串的长度为(j-i-1)*2+2=2(j-i)。

那么在原串中,这个双回文串的长度怎么算呢?

考虑一下特殊字符的出现位置、次数,可以得到是j-i。

于是i一定时,就要让j尽量大。

枚举i,这时i+pi就确定了,只需求出最大的j使j-pj-1<=i+pi。

于是需要一个数据结构,可以求出在某个区间中,小于某个值且最靠右的数在哪里。我写了一个奇怪的线段树,不知道有没有更好的方法。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#define ele int
using namespace std;
#define maxn 200010
struct node{ele _min,_max;node *l,*r;
}pool[maxn<<2];
char s1[maxn],s[maxn];
ele n,cnt,p[maxn];
node *root;
node *build(ele l,ele r){node *q=&pool[cnt++];if (l==r){q->_min=q->_max=(l-1)-p[l-1]-1;q->l=q->r=NULL;}else{ele mid=(l+r)>>1;q->l=build(l,mid);q->r=build(mid+1,r);q->_min=min(q->l->_min,q->r->_min);q->_max=max(q->l->_max,q->r->_max);}return q;
}
ele query(node *x,ele a,ele b,ele l,ele r,ele k){ele mid=(a+b)>>1;if (l<=a && b<=r){if (x->_min>k) return -1;if (a==b) return a-1;if (x->r->_min<k) return query(x->r,mid+1,b,l,r,k);return query(x->l,a,mid,l,r,k);}ele lans=-1,rans=-1;if (l<=mid) lans=query(x->l,a,mid,l,r,k);if (mid<r) rans=query(x->r,mid+1,b,l,r,k);if (rans!=-1) return rans;return lans;
}
int main(){scanf("%s",s1);n=strlen(s1);s[0]='~';for (int i=0; i<n; ++i)s[i<<1|1]='#',s[(i<<1)+2]=s1[i];s[n<<1|1]='#'; s[(n<<1)+2]='!';n=(n<<1)+3;p[0]=0;ele id=0,mx=0;for (int i=1; i<n; ++i){if (i<=mx)p[i]=min(p[id*2-i],mx-i);else p[i]=0;for (; s[i-p[i]-1]==s[i+p[i]+1]; ++p[i]);if (i+p[i]>mx){id=i;mx=i+p[i];}}root=build(1,n);ele ans=0;for (int i=0; i<n; ++i){ele j=query(root,1,n,i+1,n,i+p[i]);ans=max(ans,j-i);}printf("%d\n",ans);return 0;
}

bzoj2565题解相关推荐

  1. 【BZOJ2565】最长双回文串(回文树)

    [BZOJ2565]最长双回文串(回文树) 题面 BZOJ 题解 枚举断点\(i\) 显然的,我们要求的就是以\(i\)结尾的最长回文后缀的长度 再加上以\(i+1\)开头的最长回文前缀的长度 至于最 ...

  2. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  3. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  4. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  5. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  6. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  7. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  8. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

  9. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

最新文章

  1. koa html中添加数据,从零开始的Koa实战(6)插入数据
  2. 喜忧参半的AI,“裸奔”之下的隐私焦虑
  3. 避免button处理事件过程中 点击按钮触发事件的方法
  4. ContentType的集中数据编码格式
  5. SpringBoot+Vue+Redis实现前后端分离的字典缓存机制
  6. VTK:可视化之AlphaFrequency
  7. mysql强制禁止使用索引_MYSQL强制使用索引和禁止使用索引
  8. exe打包工具哪个最好_一键分发工具哪个最好用?30万人选择这款
  9. android 获取手机信息工具类
  10. springboot运行在eclipse报异常的问题
  11. 怎样剪立体灯笼_教你怎样做新年DIY剪纸拉花灯笼
  12. 扎克伯格5小时听证鏖战:五大焦点,四处尴尬,一次耿直CEO笑翻全场
  13. 用Java实现断点续传(HTTP)
  14. 汇编语言 王爽 第四版 第二章 检测点2.3
  15. im源码 php,thinkphpim即时通讯源码
  16. html语言单个单元格背景颜色,html如何设置表格和单元格的背景颜色
  17. SQL进阶篇之多表联查
  18. 怎么让照片里的人嘴巴动起来_动嘴app最新版(让照片说话的软件)|动嘴app安卓版下载v1.0.0-乐游网安卓下载...
  19. python案例实操_Python 操作 Word 案例
  20. c#超火表白小程序(含代码教程)

热门文章

  1. UI: 网易新闻实现
  2. 3D电视与3D眼镜的工作原理
  3. java一元二次方程求解_求JAVA解一元二次方程的程序。
  4. 将 Debian APT 引入 iPhone
  5. java 气泡图_java报表开发制作气泡图
  6. 基于宜搭的《T恤尺码收集》应用搭建最佳实践
  7. 傲游浏览器 页面广告过滤 自定义 过滤规则 及使用方法 不定时更新
  8. Taro 和 uni-app选型对比
  9. hdu6608 Fansblog(威尔逊定理)
  10. BitComet Stable (build 1.66.4.13) 比特彗星-使用教程