P12213 [蓝桥杯 2023 国 Python B] 最长回文前后缀(Manacher)

题目传送门

前言

前置知识:Manacher 求回文串

题意简介

给定一个字符串 \(S\),求取其前后缀拼接后能形成的最大回文串长度。

思路

由于我们并不想对后缀进行操作,故将 \(S\) 翻转为 \(S'\),答案显然由两部分构成:

  • \(S\) 与 \(S'\) 的最长公共前缀(将 \(S'\) 翻转回去这将分别作为答案的左右两端)。

  • 对 \(S\) 和 \(S'\) 分别求接在最长公共前缀后的最长回文串,取其较大者(直接作为答案的中间部分)。

求解方法

第一部分的答案可以暴力枚举计算,对于第二部分,Manacher 可以求解 \(arr_i\),即以位置 \(i\) 为中心的最大回文串半径,此时 \(i-arr_i+1\) 就是该回文串的左端点,若该左端点刚好是第一部分所求出前缀的下一个位置则可以用于更新第二部分的答案。

时间复杂度 \(O(n)\)。

Code

#include<iostream>
#include<algorithm>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N=1e5+5;
string str1,str2;
int Calc(string tmp)
{
int n=tmp.length(),L=0,R=-1,arr[N<<2]={0},maxx=0;
char S[N<<2];
tmp=" "+tmp,S[0]='&';
for(int i=1;i<=n;i++)
S[(i<<1)-1]=tmp[i],S[i<<1]='&';
for(int i=0;i<=(n<<1);i++)
{
if(i<=R) arr[i]=min(arr[L+R-i],R-i);
while(i-arr[i]>=0&&i+arr[i]<=(n<<1)&&S[i-arr[i]]==S[i+arr[i]]) arr[i]++;
if(i+arr[i]-1>R) L=i-arr[i]+1,R=i+arr[i]-1;
}
//上面是Manacher的板子
for(int i=0;i<=(n<<1);i++)
if(i-arr[i]+1==0) maxx=max(maxx,arr[i]-1);
return maxx;
}
int main()
{
IOS;
cin>>str1;
str2=str1;
reverse(str2.begin(),str2.end());//翻转字符串
int pre=-1;//求解最长公共前缀
while(pre+1<str1.length()&&str1[pre+1]==str2[pre+1]) pre++;
//通过substr截取最长公共前缀的下一位至末端,这一段才是第二部分答案的可用部分
cout<<((pre+1)<<1)+max(Calc(str1.substr(pre+1,str1.length()-pre-1)),Calc(str2.substr(pre+1,str2.length()-pre-1)))<<'\n';
return 0;
}

完结撒花~

P12213 [蓝桥杯 2023 国 Python B] 最长回文前后缀(Manacher)的更多相关文章

  1. Python查找最长回文暴力方法

    查找最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 例如1: 输入: "babad" 输出: "bab" ...

  2. 最长回文子串—Manacher 算法 及 python实现

    最长回文子串问题:给定一个字符串,求它的最长回文子串长度.如果一个字符串正着读和反着读是一样的,那它就是回文串.   给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最 ...

  3. Java实现 蓝桥杯VIP 算法训练 无权最长链

    试题 算法训练 无权最长链 问题描述 给定一个n节点m边的无圈且连通的图,求直径 输入格式 第一行两个数字n,m 接下来m行每行两个数字x,y,代表x,y之间有一条边 输出格式 要求用户的输出满足的格 ...

  4. 10.1 csp-s模拟测试(b) X国的军队+排列组合+回文

    T1 X国的军队 贪心,按$b-a$的大小降序排序,然后就贪心吧 #include<iostream> #include<cstdio> #include<algorit ...

  5. csp-s模拟测试10.1(b)X 国的军队,排列组合, 回文题解

    题面:https://www.cnblogs.com/Juve/articles/11615883.html X 国的军队: 好像有O(T*N)的直接贪心做法 其实多带一个log的二分也可以过 先对所 ...

  6. 平方十位数(蓝桥杯第八届国赛真题 JAVA-B组)

    思路:从大到小枚举,判断其平方是否不重复 答案:9814072356 //水题 标题:平方十位数 由0~9这10个数字不重复.不遗漏,可以组成很多10位数字. 这其中也有很多恰好是平方数(是某个数的平 ...

  7. P8701 [蓝桥杯 2019 国 B] 第八大奇迹

    简要题意 你需要维护一个长度为 \(L\) 的序列 \(a\),初始时全部都是 \(0\),有 \(N\) 个操作,支持: C p x,将 \(a_p\) 修改为 \(x\). Q a b,输出 \( ...

  8. P8622 [蓝桥杯 2014 国 B] 生物芯片

    简要题意 有 \(N\) 个二进制数,编号为 \(1\sim N\),初始时都是 \(0\).博士进行了 \(N-1\) 次操作,在第 \(i\) 次操作时,会将 \(1\sim N\) 中所有编号为 ...

  9. P8618 [蓝桥杯 2014 国 B] Log 大侠

    简要题意 给你一个长度为 \(n\) 的正整数序列 \(a\),有 \(m\) 个询问,每一个询问给出一个区间 \([l,r]\).定义函数 \(f(x)=\lfloor\log_{2}(x)+1\r ...

  10. P8796 [蓝桥杯 2022 国 AC] 替换字符

    题面 给定一个仅含小写英文字母的字符串 \(s\) 和 \(m\) 次操作,每次操作选择一个区间 \([l_i,r_i]\) 将 \(s\) 的该区间中的所有字母 \(x_i\) 全部替换成字母 \( ...

随机推荐

  1. java线程池使用小技巧:自定义拒绝策略

    java 线程池默认提供了几种拒绝策略: 这几个策略都实现了RejectedExecutionHandler,拿DiscardOldestPolicy来说,查看源码: 核心代码只有2行: e.getQ ...

  2. jsonb 为什么会影响 System.Text.Json

    我在将一个属性映射到 jsonb 类型时遇到这样一个问题 -- 我有一个抽象基类 BaseClass 和一个派生类 DerivedClass: [JsonDerivedType(typeof(Deri ...

  3. 进阶篇:3.1.3)DFM塑胶-成型不良的原因及调节方法详解

    本章目的:作为结构工程师,怎么处理注塑件成型不良的问题. 1.前言 注塑件成型不良是一个结构工程师常常需要面对的问题.很多时候并非设计上有问题,而是制造过程中的问题导致成品的不良.结构工程师了解成型不 ...

  4. mysql在liunx下面的自动备份

    由于系统基本开发完成,为了保证数据安全,需要将数据库自动备份,以下是实现自动备份的步骤: 一.在本地自动备份数据库 1. 使用mysql自带的服务mysqldump实现自动备份,首先使用vim命令编辑 ...

  5. zephyr学习: 1. windows环境下搭建 zephyr工作空间

    参考文章:1.Getting Started Guide - Zephyr Project Documentation 2.Zephyr RTOS -- 开发环境的搭建 (基于 Windows)_ze ...

  6. CF1423G Growing flowers题解

    考虑每种颜色的贡献,用总数 \(n-k+1\) 减去没有贡献到的(极长连续段长度为 \(len\) 时),贡献为 \(\max(len-k+1,0)\),所以考虑用 \(\text{ODT}\) 维护 ...

  7. 低成本订阅Claude code 和 ChatGPT 的方法,600元同时拥有ChatGPT plus + Claude code max

    野卡不能使用后,很多人找不到靠谱的订阅Claude 和 ChatGPT的支付方法,分享一下我知道的订阅方法. 最推荐的方式是尼日利亚Apple ID通过iOS订阅,但有操作门槛和相应风险,需要自己评估 ...

  8. [Windows] 视频拍摄必备神器,桌面提词器(TelePrompter)-2.7.1

    随着短视频内容的兴起,越来越多的小伙伴开始尝试拍摄视频.但没有足够的经验,可能面对镜头就懵了,不仅磕巴,还会忘词.今天介绍的这款工具是主持人.记者常用的桌面提词器,有做短视频或直播的小伙伴可以试试这款 ...

  9. easyswoole3.X在控制器里获取访问路径

    基于swoole的 $this->request()->getSwooleRequest()->server['path_info']; 基于es3自带的 $this->req ...

  10. tremble

    花了一节晚自修,想明白一个事情. 真真假假假假真真,说到底自以为是的人最小丑. 不管自己的视角,还是旁人的视角,都只是片面. 理性说,如果不要惹麻烦的话,最好还是斩断意念为好. 感性说,你得认识你自己 ...