[BZOJ 2342] 双倍回文
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] 双倍回文的更多相关文章
- BZOJ 2342 双倍回文(manacher算法)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2342 题意:定义双倍回文串为:串的长度为4的倍数且串的前一半.后一半.串本身均是回文的. ...
- bzoj 2342: 双倍回文 回文自动机
题目大意: 定义双倍回文串的左一半和右一半均是回文串的长度为4的倍数的回文串 求一个给定字符串中最长的双倍回文串的长度 题解: 我们知道可以简单地判定以某一点结尾的最长回文串 我们知道可以简单地判定以 ...
- 2018.06.30 BZOJ 2342: [Shoi2011]双倍回文(manacher)
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MB Description Input 输入分为两行,第一行为一个整数,表示字符串 ...
- BZOJ 2342: [Shoi2011]双倍回文 马拉车算法/并查集
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1123 Solved: 408 题目连接 http://w ...
- bzoj 2342: [Shoi2011]双倍回文 -- manacher
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MB Description Input 输入分为两行,第一行为一个整数,表示字符 ...
- BZOJ 2342 [Shoi2011]双倍回文(manacher+并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题目大意] 记Wr为W串的倒置,求最长的形如WWrWWr的串的长度. [题解] ...
- BZOJ 2342: 【SHOI2011】 双倍回文
题目链接:双倍回文 回文自动机第二题.构出回文自动机,那么一个回文串是一个“双倍回文”,当且仅当代表这个串的节点\(u\)顺着\(fail\)指针往上跳,可以找到一个节点\(x\)满足\(2len_x ...
- 「BZOJ 2342」「SHOI 2011」双倍回文「Manacher」
题意 记\(s_R\)为\(s\)翻转后的串,求一个串最长的形如\(ss_Rss_R\)的子串长度 题解 这有一个复杂度明显\(O(n)\)的做法,思路来自网上某篇博客 一个双倍回文串肯定当且仅当本身 ...
- 双倍回文(bzoj 2342)
Description Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输出文件只有一行,即:输入数据中字符串的最长双倍 ...
随机推荐
- 假的kd-tree小结
至今还不是很体会kd-tree这种东西,只不过体会了一种解决某些枚举问题的方法,就是当我们有一群元素,我们要到一个答案,答案在这些元素中的某个或某几个中,我们就会枚举他们,然而我们发现这样做十分低效, ...
- Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路
首先让我们来介绍Krukal算法,他是一种用来求解最小生成树问题的算法,首先把边按边权排序,然后贪心得从最小开始往大里取,只要那个边的两端点暂时还没有在一个联通块里,我们就把他相连,只要这个图里存在最 ...
- 【BZOJ 1409】 Password 数论(扩展欧拉+矩阵快速幂+快速幂)
读了一下题就会很愉快的发现,这个数列是关于p的幂次的斐波那契数列,很愉快,然后就很愉快的发现可以矩阵快速幂一波,然后再一看数据范围就......然后由于上帝与集合对我的正确启示,我就发现这个东西可以用 ...
- HDU1054 Strategic Game(最小点覆盖)
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- fastjson解析服务端返回的数据
1.配置依赖 //fastjson api 'com.alibaba:fastjson:1.2.44' 2.设计服务端返回的数据 {},{},{}]} 3.编写bean类,特别注意,要和服务端返回的类 ...
- is
MyType a = null; if (a is MyType) == False
- O(n^2)以及O(nlogn)时间复杂度的排序算法
O(n^2)的算法 都是做的升序. 简单选择排序 思路:每次选择还未排序的区间的最小值和未排序区间的第一个值交换. function selectSort(arr){ for(let i = 0; i ...
- Spring MVC框架下 从后台读取数据库并显示在前台页面【笔记自用 不推荐作为参考】
1.书写jsp页面 people.jsp 1.设计显示格式以及内容显示 2.设计显示内容的范围 2.书写entity实体类 PeopleFormMap.java 书写传入的参数主要包括 要引用的数据 ...
- macos装多个python
简介 Mac包管理工具brew: 安装方法:命令行输入 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Ho ...
- Spring - IoC(1): Spring 容器
BeanFactory & ApplicationContext org.springframework.beans.factory.BeanFactory 是最基本的 Spring 容器接口 ...