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. git使用笔记(二)分支与合并

    By francis_hao    Nov 18,2016 查看分支,* 表示当前所在分支 $ git branch 查看分支和最后一次提交记录 $ git branch -v 新建分支 $ git ...

  2. codeforces902B. Coloring a Tree

    B. Coloring a Tree 题目链接: https://codeforces.com/contest/902/problem/B 题意:给你一颗树,原先是没有颜色的,需要你给树填色成指定的样 ...

  3. [CVPR2017]Online Video Object Segmentation via Convolutional Trident Network

    基于三端卷积网络的在线视频目标分割 针对半监督视频目标分割任务,作者采取了和MaskTrace类似的思路,以optical flow为主. 本文亮点在于: 1. 使用共享backbone,三输出的自编 ...

  4. lesson 4 再谈继承多态,抽象类和接口

    再谈多态,抽象类和接口 上一次博客已经概念性的概述了继承多态,抽象类和接口,这次来具体的谈一谈他们之间的联系和需要注意的地方. 一.继承和多态:Inheritance (继承) & Polym ...

  5. leetcode-501. Find Mode in Binary Search Tree

    Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred ...

  6. sublime text 2学习(二):创建可复用的代码片段

    对于前端工程师来讲,写一个html页面的基本结构是体力活,每次去拷贝一个也麻烦,sublime text 2 提供了一个很好的复用代码片段.下面介绍一下创建一个html5的代码片段的过程. 在菜单上点 ...

  7. [Leetcode Week6]Best Time to Buy and Sell Stock

    Best Time to Buy and Sell Stock 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/best-time-to-buy-and ...

  8. python学习笔记 协程

    在学习异步IO模型前,先来了解协程 协程又叫做微线程,Coroutine 子程序或者成为函数,在所有语言中都是层级调用,比如a调用b,b调用c.c执行完毕返回,b执行完毕返回,最后a执行完毕返回 所以 ...

  9. Entity Framework 6.1.2 offset row fetch next 错误解决办法

    本地测试环境用的SqlServer2012,生产环境2008R2.然后在查询分页数据时生产环境悲剧的报错了. 原因是EF6.1.2以上版本在编译SQL时使用了新的语法对低版本的SqlServer不兼容 ...

  10. Mysql启动服务提示系统找不到指定的文件

    Mysql启动服务: C:\Windows\system32>net start mysql发生系统错误 2. 系统找不到指定的文件. 怎么还是报这个错?难道不是由于配置的原因?对,不是由于上面 ...