Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2342

Algorithm:

解决回文串问题,一般从对称轴下手

肯定先跑一边Manacher,(可以只记录长度为偶数的回文串)

枚举x为“主”对称轴,实际上对称轴在x到x+1之间。这样外层大的回文串wwRwwR就确定了。

接下来就只要枚举一半的回文串wwR的对称轴y了,从而用len(x+1,y)*4更新答案

当且仅当 y-m[y]<=x 并 y<=x+m[x]/2时是符合要求的x和y(由于回文串的性质,大于时不影响答案)

同时维护两个条件求最优解时,

我们先构造一个条件的单调性,再每次在排好序的队列中O(logN)地查询最优地符合第二个条件的数

于是我们先将序列按k-m[k]排序,将其放入set中,保证set中的k-m[k]<=当前的i

再每次在set中查询最大的k使得k<=i+m[i]/2即可

Code:

#include <bits/stdc++.h>

using namespace std;

const int MAXN=5e5+;
char dat[MAXN];
int n,m[MAXN],pre[MAXN],res=; set<int> s; void manacher()
{
int mx=,mid;
for(int i=;i<=n;i++)
{
if(i<mx) m[i]=min(mx-i,m[mid*-i]);
else m[i]=; while(dat[i+m[i]+]==dat[i-m[i]]) m[i]++; //只查询长度为偶数的回文串 if(i+m[i]>mx) mid=i,mx=m[i]+i;
}
} bool cmp(int x,int y)
{
return x-m[x]<y-m[y];
} int main()
{
scanf("%d",&n);
scanf("%s",dat+);dat[]='#';
manacher(); for(int i=;i<=n;i++) pre[i]=i;
sort(pre+,pre+n+,cmp); int cur=;
for(int i=;i<=n;i++)
{
while(pre[cur]-m[pre[cur]]<=i && cur<=n) //维护第一个条件的单调性
s.insert(pre[cur]),cur++;
set<int>::iterator it=s.upper_bound(i+m[i]/);
if(it!=s.begin()) //边界判断
res=max(res,(*--it-i)*);
}
cout << res;
return ;
}

Review:

1、解决回文串问题,一般从对称轴下手

根据条件不同,对枚举出的对称轴做不同的处理

2、灵活使用回文串的对称性,

大部分时候只用处理一半的字符,剩余的会由对称性保证正确性

3、同时维护两个条件求最优解时,

我们先构造一个条件的单调性(通过特殊条件排序实现)

[BZOJ 2342] 双倍回文的更多相关文章

  1. BZOJ 2342 双倍回文(manacher算法)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2342 题意:定义双倍回文串为:串的长度为4的倍数且串的前一半.后一半.串本身均是回文的. ...

  2. bzoj 2342: 双倍回文 回文自动机

    题目大意: 定义双倍回文串的左一半和右一半均是回文串的长度为4的倍数的回文串 求一个给定字符串中最长的双倍回文串的长度 题解: 我们知道可以简单地判定以某一点结尾的最长回文串 我们知道可以简单地判定以 ...

  3. 2018.06.30 BZOJ 2342: [Shoi2011]双倍回文(manacher)

    2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MB Description Input 输入分为两行,第一行为一个整数,表示字符串 ...

  4. BZOJ 2342: [Shoi2011]双倍回文 马拉车算法/并查集

    2342: [Shoi2011]双倍回文 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1123  Solved: 408 题目连接 http://w ...

  5. bzoj 2342: [Shoi2011]双倍回文 -- manacher

    2342: [Shoi2011]双倍回文 Time Limit: 10 Sec  Memory Limit: 128 MB Description Input 输入分为两行,第一行为一个整数,表示字符 ...

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

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

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

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

  8. 「BZOJ 2342」「SHOI 2011」双倍回文「Manacher」

    题意 记\(s_R\)为\(s\)翻转后的串,求一个串最长的形如\(ss_Rss_R\)的子串长度 题解 这有一个复杂度明显\(O(n)\)的做法,思路来自网上某篇博客 一个双倍回文串肯定当且仅当本身 ...

  9. 双倍回文(bzoj 2342)

    Description Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输出文件只有一行,即:输入数据中字符串的最长双倍 ...

随机推荐

  1. poj 2104 (划分树模板)

    Description You are working for Macrohard company in data structures department. After failing your ...

  2. input 只允许输入数字

    onkeyup='this.value=this.value.replace(/[^0-9\-]/gi,"")'

  3. centos 安装mysql 笔记

    1.查询已安装软件的目录 rpm -ql mysql 2.mysql的安装卸载 a. 查找已安装的myslq 版本: #rpm  -qa | grep  mysql (注意大小写,如果mysql 不行 ...

  4. 从一段字符串中去除数字的shell方法

  5. 【HDU4405】Aeroplane chess [期望DP]

    Aeroplane chess Time Limit: 1 Sec  Memory Limit: 32 MB[Submit][Stataus][Discuss] Description Hzz lov ...

  6. 【BZOJ2338】【HNOI2011】数矩形 [计算几何]

    数矩形 Time Limit: 20 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 最近某歌手在研究自己的全国巡回演出, ...

  7. bzoj 1297 矩阵乘法变形

    首先对于矩阵乘法的功能有很多,记得有篇论文叫矩阵乘法在信息学竞赛中的应用,里面详细介绍了矩阵的 作用 其中一个就是求图的固定时间方案数,也就是给定一张图,每两个点之间由一条边长为1的边相连, 求任意两 ...

  8. CSS3 文本效果(阴影)

    CSS3中包含几个新的文本特征. 在本章中您将了解以下文本属性: text-shadow box-shadow text-overflow word-wrap word-break CSS3 的文本阴 ...

  9. logging模块的使用

    # -*- coding: utf-8 -*- import os import time import logging import sys log_dir1=os.path.join(os.pat ...

  10. Bean装配之@Autowired注解

    @Required(不常用) @Autowired(常用) 下面用例子解释以上内容: @Autowired注解的三种方式如下,第一种是直接在属性名上加注解,这样就可以不用在写set方法进行注入,这种方 ...