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. How to reclaim space in InnoDB when innodb_file_per_table is ON

    When innodb_file_per_table is OFF and all data is going to be stored in ibdata files. If you drop so ...

  2. 7月17号day9总结

    今天学习过程和小结 今天学习了如何使用idea操作hdfs. public class HDFSTest {    Configuration configuration;    FileSystem ...

  3. css中clip:rect矩形剪裁功能

    一.示例 img { position:absolute; clip:rect(30px,200px,200px,20px); } 二.理解 clip 属性剪裁绝对定位元素. clip:rect矩形剪 ...

  4. React module methods with passing props to child or invoking callback to parent.

    Some code samples for this pupose: import React from "react"; import MyDemo from "./m ...

  5. DotNet 学习笔记 应用状态管理

    Application State Options --------------------------------------------------------------------- *Htt ...

  6. js获取上个月日期

    javascript根据当前日期获取上个月日期 function lastMonthDate(){ var Nowdate = new Date(); var vYear = Nowdate.getF ...

  7. Linux提权思路

    先写个大概 0. dirtycow 不同的dirtycow有不同执行条件. 使用前先对照此表根据内核版本确认是否已经修复 https://github.com/dirtycow/dirtycow.gi ...

  8. Ajax的Result工具类

    ResultUtil.java package cn.qlq.util; import java.io.Serializable; public class ResultUtil<T> i ...

  9. elasticsearch.helpers.ScanError: Scroll request has only succeeded on xx shards

    # 当index=''为空时出现此错误

  10. kvm的vmcall

    这几个接口的区别在于参数个数的不用,本质是一样的.挑个参数最多的看下: static inline long kvm_hypercall4(unsigned int nr, unsigned long ...