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. [CERC2017]Intrinsic Interval——扫描线+转化思想+线段树

    [CERC2017]Intrinsic Interval https://www.luogu.org/blog/ywycasm/solution-p4747# 这种“好的区间”,见得还是比较多的了. ...

  2. __cdecl,__stdcall,__fastcall,__pascal,__thiscall 的区别

    关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解. microsoft的vc默认的是__cdecl方式,而windo ...

  3. js密码的匹配正则

    匹配的密码是 数字大写或者小写的字母.符号. if(pwd.match(/[\d]/) && pwd.match(/[A-Za-z]/) && pwd.match(/[ ...

  4. hibernate连接oracle数据库

    前言:以下所有的操作都是基于你已经成功安装了oracle数据库并且java的开发环境正常的情况下进行的. 如果没有完善请先配置基础环境. 第一步:配置需要的环境(下载并导入需要的包). 下载链接:ht ...

  5. c# vs2008报表

    1. 做报表没做几次,第一次做的都忘记了,还好今天做一下就把报表弄成功了.报表中“参数字段”是可以变的,就是说需要自己赋值或者是要计算的.而在苏据库字段里面的是固定的值.不需要计算(注:有的字段查询出 ...

  6. [POJ1082&POJ2348&POJ1067&POJ2505&POJ1960]简单博弈题总结

    鉴于时间紧张...虽然知道博弈是个大课题但是花一个上午时间已经极限了... 希望省选过后再回过头来好好总结一遍吧. 接下来为了看着顺眼一点...还是按照难度顺序吧   POJ1082 一道最简单的博弈 ...

  7. 填坑webpack

    1.Concepts: webpack is a module bundler for modern JS applications. Since there are lots of complex ...

  8. Ubuntu 下nginx 的卸载 与重新装

    由于本人把自己服务器的nginx 给玩坏了,不得已选择卸载重新安装,(先让我哭一会) 然后我把/usr/sbin/nginx  和/etc/nginx 和/usr/share/nginx 和 /usr ...

  9. 从setting文件导包

    两种方式 from project.settings.py import s3_key 第二种: from django.conf import setting s3_key = settings.S ...

  10. Swift “ambiguous use of operator '>'”

    http://stackoverflow.com/questions/25458548/swift-ambiguous-use-of-operator 3down votefavorite   I h ...