题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2342

题意:求最长子串使得它有四个相同的回文串SSSS相连组成。

首先跑一边Manacher,初始化出以每一个点为最长回文串的左端点,然后按左端点排序。

枚举中间点$x$,然后找右面的中间点$y$,使得$y$满足

$y-p_y\leq x$

$y\leq x+r_x\div 2$

用set维护y,然后求出最接近$x+r_x\div 2$,用--upper_bound()返回$y$的迭代器it。(注意不要直接用lower_bound()

则$ans=max((*it)-i)\times 2$   -->因为有‘#’,*2即可。

AC代码:

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int N=;
int p[N*];
char str[N],s[N*];
int n,t,ans;
set<int> Set;
set<int>::iterator it; struct node{
int v,id;
}a[N]; bool cmp(node x,node y){
return x.v<y.v;
} void manacher(int len){
s[]='$'; s[++t]='#';
for(int i=;i<=len;i++){
s[++t]=str[i];
s[++t]='#';
}
int pos=,mx=;
for(int i=;i<=t;i++){
if(i>mx) p[i]=;
else p[i]=min(p[*pos-i],mx-i);
while(i+p[i]<=t&&i-p[i]>=&&s[i+p[i]]==s[i-p[i]]) p[i]++;
if(i+p[i]>mx){
mx=i+p[i];
pos=i;
}
}
} void solve(){
int q=;
for(int i=;i<=t;i++) if(i&) a[++q].v=i-p[i],a[q].id=i;
sort(a+,a+q+,cmp);
int now=;
for(int i=;i<=t;i++) if(i&){
while(now<q&&a[now].v<=i) Set.insert(a[now].id),now++;
it=--Set.upper_bound(i+p[i]/);
if(it!=Set.begin()) ans=max(ans,(*it)-i);
}
printf("%d\n",ans*);
} int main(){
scanf("%d",&n);
scanf("%s",str+);
manacher(n);
solve();
return ;
}

AC代码

BZOJ 2342 [Shoi2011]双倍回文(Manacher)的更多相关文章

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

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

  2. BZOJ 2342: [Shoi2011]双倍回文 [Manacher + set]

    题意: 求最长子串使得它有四个相同的回文串SSSS相连组成 枚举中间x 找右边的中间y满足 y-r[y]<=x y<=x+r[x]/2 用个set维护 注意中间只能是# #include ...

  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. Manacher || BZOJ 2342: [Shoi2011]双倍回文 || Luogu P4287 [SHOI2011]双倍回文

    题面:[SHOI2011]双倍回文 题解:具体实现时,就是在更新mr时维护前半段是回文串的最长回文串就好了 正确性的话,因为到i时如果i+RL[i]-1<=mr,那么答案肯定在i之前就维护过了: ...

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

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

  7. BZOJ 2342 [SHOI2011]双倍回文 (回文自动机)

    题目大意:略 先建出$PAM$ 因为双倍回文串一定是4的倍数,所以找出$PAM$里所有$dep$能整除4的节点 看这个串是否存在一个回文后缀,长度恰好为它的一半,沿着$pre$链往上跳就行了 暴跳可能 ...

  8. bzoj 2342 [Shoi2011]双倍回文(manacher,set)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题意] 求出形如w wR w wR的最长连续子串. [思路] 用manache ...

  9. BZOJ 2342 [Shoi2011]双倍回文(manacher+堆+set)

    题意 N<=500000 题解 维护一个set可以用堆来解决. #include<iostream> #include<cstring> #include<cstd ...

随机推荐

  1. CMS系统

    CMS是Content Management System的缩写,意为"内容管理系统" 对于内容管理,业界还没有一个统一的定义,不同的机构有不同的理解: 内容管理系统是企业信息化建 ...

  2. unity一些操作汇总

    设置父物体高度自适应子物体:父物体添加ContentSizeFitter,设置Horizeontal Fit和Vertical Fit为Preferred Size. ScrollView设置Cone ...

  3. IndexedDB基本概念

    控制台 IndexedDB下为数据库 数据库下为表,表内容展现为主键值和其余值,其中其余值包括索引和其他任意字段,以对象形式表现 表下为索引字段表,用来展现拥有同一种索引字段的所有数据(有多少种索引就 ...

  4. Xamarin.Android 开发,生成时提示“Resource.Drawable”未包含“BG”的定义

    Xamarin Android提示Resource.Drawable”未包含“BG”的定义错误信息:error CS0117: '“Resource.Drawable”未包含“BG”的定义Xamari ...

  5. 2019牛客多校第一场H XOR 线性基模板

    H XOR 题意 给出一组数,求所有满足异或和为0的子集的长度和 分析 n为1e5,所以枚举子集肯定是不可行的,这种时候我们通常要转化成求每一个数的贡献,对于一组数异或和为0.我们考虑使用线性基,对这 ...

  6. Pytest学习10-pytest与unittest的区别

    一.用例编写规则 1.unittest提供了test cases.test suites.test fixtures.test runner相关的类,让测试更加明确.方便.可控.使用unittest编 ...

  7. 机器学习作业(七)非监督学习——Matlab实现

    题目下载[传送门] 第1题 简述:实现K-means聚类,并应用到图像压缩上. 第1步:实现kMeansInitCentroids函数,初始化聚类中心: function centroids = kM ...

  8. 【vue】 vue跳转页面:router-link/this.$router.push()

    1.通过标签<router-link> <router-link to='A'>跳转到A页面</router-link> 2.通过方法 this.$router.p ...

  9. JavaScript函数、对象和数组

    一.JavaScript函数 1.定义函数:函数的通用语法如下 function function_name([parameter [, ...]]) { statements; } 由关键字func ...

  10. Mac 上完美解决SVN问题及svn软件

    注:本文是转自https://blog.csdn.net/qq_40144558/article/details/80630466 svn对Mac的支持不算美好,几乎所有软件都很繁琐,我们作为开发其实 ...