链接:

P4555


题意:

在字符串 \(S\) 中找出两个相邻非空回文串,并使它们长度之和最大。


分析:

直接使用马拉车算法求出每个点扩展的回文串。如果枚举两个回文串显然会超时,我们考虑切割一个长串,即枚举切割点,只需枚举每个 \(\#\) 即可,但为了保证两个串都非空,所以最左和最右的 \(\#\) 不能枚举。然后我们需要找到最靠左的回文串中心 \(L\) 使得该回文串包括该点,以及最靠右的回文串中心 \(R\) 使得该回文串包括该点,发现两个回文串长度之和就是 \(R-L\)。同时我们发现当切割点向右移动,\(L\) 的位置是单调增的,当切割点向左移动,\(R\) 的位置是单调减的。所以我们可以双指针维护出每个切割点位置对应的 \(L\) 和 \(R\)。于是就做完了。


代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
string t="@#";int n;
inline void gett(){
char c=getchar();
while(c>'z'||c<'a')c=getchar();
while(c>='a'&&c<='z')t+=c,t+="#",c=getchar();
n=t.length();
}
int hm[N],mr,mid;
inline void match(){
for(int i=1;i<n;i++){
hm[i]=(mr>i)?min(hm[(mid<<1)-i],mr-i):1;
while(t[i+hm[i]]==t[i-hm[i]])hm[i]++;
if(i+hm[i]>mr)mr=i+hm[i],mid=i;
}
}
int ans,now;
int l[N],r[N];
signed main(){
gett();
match();
now=1;
for(int i=1;i<n;i++){
while(i>now+hm[now]-1)now++;
l[i]=now;//最靠左的回文串中心L
}
now=n;
for(int i=n-1;i>=1;i--){
while(i<now-hm[now]+1)now--;
r[i]=now;//最靠右的回文串中心R
}
for(int i=3;i<n-2;i+=2)
ans=max(r[i]-l[i],ans);
cout<<ans;
return 0;
}

洛谷 P4555 [国家集训队]最长双回文串的更多相关文章

  1. 洛谷 P4555 [国家集训队]最长双回文串 解题报告

    P4555 [国家集训队]最长双回文串 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为\(n\)的串 ...

  2. 洛谷 P4555 [国家集训队]最长双回文串(Manacher)

    题目链接:https://www.luogu.com.cn/problem/P4555 首先明白两个回文串,那么要使两个回文串成立,那么我们只能把$'#'$作为中间节点. 然后我们跑一边Manache ...

  3. 洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)

    题意 题目链接 Sol 我的做法比较naive..首先manacher预处理出以每个位置为中心的回文串的长度.然后枚举一个中间位置,现在要考虑的就是能覆盖到i - 1的回文串中 中心最靠左的,和能覆盖 ...

  4. 【洛谷】P4555 [国家集训队]最长双回文串

    P4555 [国家集训队]最长双回文串 题源:https://www.luogu.com.cn/problem/P4555 原理:Manacher 还真比KMP好理解 解决最长回文串问题 转化为长度为 ...

  5. P4555 [国家集训队]最长双回文串

    P4555 [国家集训队]最长双回文串 manacher 用manacher在处理时顺便把以某点开头/结尾的最长回文串的长度也处理掉. 然后枚举. #include<iostream> # ...

  6. Manacher || P4555 [国家集训队]最长双回文串 || BZOJ 2565: 最长双回文串

    题面:P4555 [国家集训队]最长双回文串 题解:就.就考察马拉车的理解 在原始马拉车的基础上多维护个P[i].Q[i]数组,分别表示以i结尾最长回文子串的长度和以i开头的最长回文子串的长度 然后就 ...

  7. P4555 [国家集训队]最长双回文串(回文树)

    题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 n 的串 S ,求 S 的最长双回文子串 T ,即可 ...

  8. BZOJ.2565.[国家集训队]最长双回文串(Manacher/回文树)

    BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长 ...

  9. [国家集训队]最长双回文串 manacher

    ---题面--- 题解: 首先有一个直观的想法,如果我们可以求出对于位置i的最长后缀回文串和最长前缀回文串,那么我们枚举分界点然后合并前缀和后缀不就可以得到答案了么? 所以我们的目标就是求出这两个数列 ...

随机推荐

  1. 分布式搜索引擎Elasticsearch在CentOS7中的安装

    1. 概述 随着企业业务量的不断增大,业务数据随之增加,传统的基于关系型数据库的搜索已经不能满足需要. 在关系型数据库中搜索,只能支持简单的关键字搜索,做不到分词和统计的功能,而且当单表数据量到达上百 ...

  2. Python中with...as...的用法详解

    简介 with是从Python2.5引入的一个新的语法,它是一种上下文管理协议,目的在于从流程图中把 try,except 和finally 关键字和资源分配释放相关代码统统去掉,简化try-.exc ...

  3. 集合遍历数组三种常用方式(Collecton和Map)

    Collection集合遍历数组的三种方式: 迭代器 foreach(增强for循环) JDK1.8之后的新技术Lambda 迭代器: 方法:public Iterator inerator():获取 ...

  4. c++ 打包函数教程

    c++当要重复运行一些代码时可以打包一个函数 当没有返回值时用void打包函数: #include <iostream> #include <stdio.h> using na ...

  5. Java技术开发专题系列之【Guava RateLimiter】针对于限流器的入门到精通(针对于源码分析介绍)

    Guava包中限流实现分析 RateLimiter 之前的文章中已经介绍了常用的限流算法,而google在Java领域中使用Guava包中的限流工具进行服务限流. 回顾使用案例 Google开源工具包 ...

  6. 我爬取交通学博士付费的GIS资源,每年被动收入2w很简单?

    目录 1.背景介绍 2.技术路线 3.数据结果 4.数据分析 5.总结 6.后记 1.背景介绍 某周末闲来无事,顺手打开了CSDN,看到了一个人发布的收费GIS资源,售价是¥19.9,POI数据也有人 ...

  7. 学习PHP中好玩的Gmagick图像操作扩展的使用

    在 PHP 的图像处理领域,要说最出名的 GD 库为什么好,那就是因为它不需要额外安装的别的什么图像处理工具,而且是随 PHP 源码一起发布的,只需要在安装 PHP 的时候添加上编译参数就可以了. G ...

  8. EcShop首页显示特定分类的精品新品热销特价等推荐商品

    EcShop首页显示特定分类的精品新品热销特价等推荐商品 很多大型的B2C商城都有特定分类专区,该分类下的[分类名称].[推荐子分类 或 推荐品牌].[大图片/推荐单品].[推荐商品].[促销商品]. ...

  9. JPA基本用法

    jpa基本查询 1.继承JpaRepository,生成了CRUD方法 public void testBaseQuery() throws Exception {   User user=new U ...

  10. python-matplotlib学习(1)

    1 import matplotlib.pyplot as plt 2 import numpy as np 3 4 x=np.linspace(-1,1,50) 5 y=2*x+1 6 plt.pl ...