题面:[SHOI2011]双倍回文

题解:具体实现时,就是在更新mr时维护前半段是回文串的最长回文串就好了

正确性的话,因为到i时如果i+RL[i]-1<=mr,那么答案肯定在i之前就维护过了;

因此只有在i+RL[i]-1>mr时需要维护答案

由于mr最多被更新N<<1次,所以时间效率是对的;在找前半段最长的回文串时,记得从外向内枚举,一旦发现答案就立即break,否则效率会假

最后,注意只需要判前半段是否满足条件就好了,一是因为我们不清楚后半段相应位置的真实RL值,二是这是个回文串,左右是相等的。

代码:

 #include<cstdio>
#include<cstring>
#include<iostream>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int maxn=(5e5)+;
int N,len,mid,mr,RL[maxn<<],ans=,a;
char O[maxn],S[maxn<<];
inline void Manacher(){
mid=mr=;
for(int i=;i<=len;i++){
if(i<mr)RL[i]=min(mr-i,RL[(mid<<)-i]);
else RL[i]=;
while(S[i-RL[i]]==S[i+RL[i]])RL[i]++;
if(i+RL[i]->mr){
mr=i+RL[i]-;
mid=i;
if(S[i]=='#'){
for(int j=RL[i]-;j>=;j-=){
a=i-(j>>);
if(a>=&&S[a]=='#'&&a+RL[a]->=i){
ans=max(ans,j);
break;
}
}
}
}
}
return;
}
int main(){
scanf("%d",&N);
scanf("%s",O);
S[]='$';
S[len=]='#';
for(int i=;i<N;i++){
S[++len]=O[i];
S[++len]='#';
}
Manacher();
printf("%d\n",ans);
return ;
}

By:AlenaNuna

Manacher || BZOJ 2342: [Shoi2011]双倍回文 || Luogu P4287 [SHOI2011]双倍回文的更多相关文章

  1. BZOJ 2342 [Shoi2011]双倍回文(manacher+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题目大意] 记Wr为W串的倒置,求最长的形如WWrWWr的串的长度. [题解] ...

  2. BZOJ 2342 [Shoi2011]双倍回文(Manacher)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2342 题意:求最长子串使得它有四个相同的回文串SSSS相连组成. 首先跑一边Manach ...

  3. BZOJ 2342: 【SHOI2011】 双倍回文

    题目链接:双倍回文 回文自动机第二题.构出回文自动机,那么一个回文串是一个“双倍回文”,当且仅当代表这个串的节点\(u\)顺着\(fail\)指针往上跳,可以找到一个节点\(x\)满足\(2len_x ...

  4. BZOJ 2342 回文串-Manacher

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2342 思路:先跑一遍Manacher求出p[i]为每个位置为中心的回文半径,因为双倍回文串 ...

  5. 【回文字符串】 最长回文子串O(N) Manacher算法

    原理讲的清晰:Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串 注意: ①动态生命P[]和newStr数组后,不要忘记delete[] //其实这是基本的编码习惯 ②最终 ...

  6. 回文数 第N个回文数

    判断回文数还是不难,如果能转为字符串就更简单了. 如果是求第N个回文数呢. 12321是一个回文数,这里先考虑一半的情况. 回文数的个数其实是有规律的.如: 1位回文数: 9个 2位回文数: 9个 3 ...

  7. 【原】中文Ubuntu主目录下的文档文件夹改回英文

    想把中文Ubuntu主目录下的文档文件夹改回英文,在Terminal下面操作的时候要输入中文特别不方便,于是便用了更改名字的想法 方法一: 首先把那几个中文名称修改成相应的英文,比如 Desktop. ...

  8. (回文串)leetcode各种回文串问题

    题目一:最长连续回文子串. 问题分析:回文串顾名思义表示前后读起来都是一样,这里面又是需要连续的.分析这个问题的结构,可以想到多种方法.暴力解决的方式,2层循环遍历得出各个子串,然后再去判断该子串是否 ...

  9. WHU 583 Palindrome ( 回文自动机 && 本质不同的回文串的个数 )

    题目链接 题意 : 给你一个串.要你将其划分成两个串.使得左边的串的本质不同回文子串的个数是右边串的两倍.对于每一个这样子的划分.其对答案的贡献就是左边串的长度.现在要你找出所有这样子的划分.并将贡献 ...

随机推荐

  1. 国内4G频段划分

    国内4G频段划分 2015年   4G网络建设如火如荼地进行,换手机大家几乎都买的4G手机,那么看到如下参数怎么知道手机所支持的网络呢? SIM 1:4G TDD-LTE:TD38/39/40/41: ...

  2. mysql 全量备份以及增量备份

    MySQL 的全量备份很简单,增量备份虽然会手动使用但是还没写过脚本去实现增量备份.今天搞一搞,顺便回忆一下MySQL的基本操作.

  3. 吃着火锅唱着歌学会Docker

    第一篇:Docker概述 第二篇:Docker之版本与安装 第三篇:Docker之镜像 第四篇:Docker之容器 第五篇:Dcoker之容器与镜像 第六篇:Docker之网络管理 第七篇:Docke ...

  4. 2018.03.29 python-pandas 数据读取

    #数据读取# read_table,read_csv,read_excel #读取普通分隔数据:read_table #可以读取txt,csv import os import pandas as p ...

  5. wpf datagrid tooltip

    <DataGridTemplateColumn Header="购方名称" Width="260" HeaderStyle="{StaticRe ...

  6. Python文档操作

    1.打开和关闭文件 open('C:\Users\Second One\Desktop\a.txt')文件路径必须完整路径且为字符串格式 有三种方式: open('C:\\Users\\Second ...

  7. 初学node.js-nodejs中实现修改用户路由

    经过前面几次的学习,已经可以做下小功能,今天要实现的是修改用户路由. 一.users_model.js  功能:定义用户对象模型 var mongoose=require('mongoose'), S ...

  8. win10安装anaconda及tensorflow1.9版本

    前言 因为之前的anaconda的conda命令不能用,又找不到原因,所以就决定重装anaconda,然后再装个tensorflow环境.. 正文 可以去官网下载,也可以去清华的开源软件镜像站下载ht ...

  9. 第八周作业总结&第六次实验报告

    实验六 Java异常 实验目的 理解异常的基本概念: 掌握异常处理方法及熟悉常见异常的捕获方法. 实验要求 练习捕获异常.声明异常.抛出异常的方法.熟悉try和catch子句的使用. 掌握自定义异常类 ...

  10. python 三元表达式

    python 三元表达式(ternary expression)  把 if-else块 写到一行或者一个表达式中 并且产生一个值 value = true if condition else fal ...