不知道有没有人跟我一样数据结构学傻了

首先这道题是要求回文串,那么我们可以想到manacher算法

但由于\(manacher\)不能求出双回文子串,我们要考虑一些性质

首先对于一个回文串,删掉两边的字符它一样是回文串

然后\(manacher\)求出的\(p\)数组就是他能拓展的数量,发现对于一个点对\(i, j\),当满足\(i+p_i+1≥j-p_j+1\)时,两个回文串有交集,根据上述性质,这对点对是可以构成双回文子串的

上述式子是可以用权值线段树实现的,每找到一个\(i+p_i\),丢尽权值线段树里面,每次查询权值线段树中\([j-p_j, MAX]\)的最小的\(i\),用\(j-i+1\)更新答案即可

(注意本身就是一个回文串的情况)

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rep(i, s, t) for(int i = s; i <= t; ++ i)
#define maxn 200005
#define inf 123456789
int n, m, cnt, p[maxn], Ans, MAX = 200000, mi[maxn << 2], pax;
char c[maxn], s[maxn];
#define ls k << 1
#define rs k << 1 | 1
il void build(int k, int l, int r) {
mi[k] = inf;
if(l == r) return;
int mid = (l + r) >> 1;
build(ls, l, mid), build(rs, mid + 1, r);
}
il void insert(int k, int l, int r, int ll, int v) {
if(l == r) return(void)(mi[k] = min(v, mi[k]));
int mid = (l + r) >> 1;
if(ll <= mid) insert(ls, l, mid, ll, v);
else insert(rs, mid + 1, r, ll, v);
mi[k] = min(mi[ls], mi[rs]);
}
il int query(int k, int l, int r, int ll, int rr) {
if(ll <= l && r <= rr) return mi[k];
int mid = (l + r) >> 1, ans = inf;
if(ll <= mid) ans = query(ls, l, mid, ll, rr);
if(mid < rr) ans = min(ans, query(rs, mid + 1, r, ll, rr));
return ans;
}
il void build() {
scanf("%s", c + 1), n = strlen(c + 1), s[++ cnt] = '~', s[++ cnt] = '#';
rep(i, 1, n) s[++ cnt] = c[i], s[++ cnt] = '#';
s[++ cnt] = '!';
}
il void solve() {
int mid = 0, mr = 0;
rep(i, 2, cnt - 1) {
if(i <= mr) p[i] = min(p[mid * 2 - i], mr - i + 1);
else p[i] = 1;
while(s[i - p[i]] == s[i + p[i]]) ++ p[i];
if(i + p[i] > mr) mr = i + p[i] - 1, mid = i;
Ans = max(Ans, i - query(1, 1, MAX, i - p[i] + 1, MAX));
insert(1, 1, MAX, i + p[i], i), pax = max(pax, p[i]);
}
if(pax - 1 == n) printf("%d", n - 1);
else printf("%d", Ans);
}
int main() {
return build(1, 1, MAX), build(), solve(), 0;
}

P4555 【[国家集训队]最长双回文串】的更多相关文章

  1. P4555 [国家集训队]最长双回文串

    P4555 [国家集训队]最长双回文串 manacher 用manacher在处理时顺便把以某点开头/结尾的最长回文串的长度也处理掉. 然后枚举. #include<iostream> # ...

  2. 洛谷 P4555 [国家集训队]最长双回文串 解题报告

    P4555 [国家集训队]最长双回文串 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为\(n\)的串 ...

  3. Manacher || P4555 [国家集训队]最长双回文串 || BZOJ 2565: 最长双回文串

    题面:P4555 [国家集训队]最长双回文串 题解:就.就考察马拉车的理解 在原始马拉车的基础上多维护个P[i].Q[i]数组,分别表示以i结尾最长回文子串的长度和以i开头的最长回文子串的长度 然后就 ...

  4. 【洛谷】P4555 [国家集训队]最长双回文串

    P4555 [国家集训队]最长双回文串 题源:https://www.luogu.com.cn/problem/P4555 原理:Manacher 还真比KMP好理解 解决最长回文串问题 转化为长度为 ...

  5. P4555 [国家集训队]最长双回文串(回文树)

    题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 n 的串 S ,求 S 的最长双回文子串 T ,即可 ...

  6. 洛谷 P4555 [国家集训队]最长双回文串(Manacher)

    题目链接:https://www.luogu.com.cn/problem/P4555 首先明白两个回文串,那么要使两个回文串成立,那么我们只能把$'#'$作为中间节点. 然后我们跑一边Manache ...

  7. 洛谷 P4555 [国家集训队]最长双回文串

    链接: P4555 题意: 在字符串 \(S\) 中找出两个相邻非空回文串,并使它们长度之和最大. 分析: 直接使用马拉车算法求出每个点扩展的回文串.如果枚举两个回文串显然会超时,我们考虑切割一个长串 ...

  8. 洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)

    题意 题目链接 Sol 我的做法比较naive..首先manacher预处理出以每个位置为中心的回文串的长度.然后枚举一个中间位置,现在要考虑的就是能覆盖到i - 1的回文串中 中心最靠左的,和能覆盖 ...

  9. BZOJ.2565.[国家集训队]最长双回文串(Manacher/回文树)

    BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长 ...

  10. [国家集训队]最长双回文串 manacher

    ---题面--- 题解: 首先有一个直观的想法,如果我们可以求出对于位置i的最长后缀回文串和最长前缀回文串,那么我们枚举分界点然后合并前缀和后缀不就可以得到答案了么? 所以我们的目标就是求出这两个数列 ...

随机推荐

  1. springboot笔记08——整合swagger2

    Swagger是什么? Swagger是一个RESTFUL 接口的文档在线自动生成和功能测试的框架.利用swagger2的注解可以快速的在项目中构建Api接口文档,并且提供了测试API的功能. Spr ...

  2. Linux下Java变量

    一.JAVA_HOME.PATH.CLASSPATH详解 1.1.JAVA_HOME 指向jdk安装目录,该目录下有bin.lib目录.Eclipse/NetBeans/Tomcat等软件就是通过搜索 ...

  3. 纯CSS一个div实现无缝隙尖角框

    话不多说直接先上效果图 其实原理很简单,就是一个带边框的方块加上一个黑色三角形和一个白色三角形,最后通过position定位实现. 代码如下: HTML就一个div <div></d ...

  4. C# 后台获取GridView列表的值

    int rowIndex = ((GridViewRow)((Button)sender).NamingContainer).RowIndex;//获取gridview中的行号            ...

  5. C++之同名覆盖、多态

    一.同名覆盖引发的问题 父子间的赋值兼容--子类对象可以当作父类对象使用(兼容性) 1.子类对象可以直接赋值给父类对象 2.子类对象可以直接初始化父类对象 3.父类指针可以指向子类对象 4.父类引用可 ...

  6. nginx 是如何分配 worker 进程连接数的

    客户端连接过来后,多个空闲的进程,会竞争这个连接,很容易看到,这种竞争会导致不公平,如果某个进程得到 accept 的机会比较多,它的空闲连接很快就用完了,如果不提前做一些控制,当 accept 到一 ...

  7. mac中git使用

    配置用户名及邮箱在使用Git提交前,必须配置用户名和邮箱,这些信息会永久保存到历史记录中.git config --global user.name "xxxxxx"git con ...

  8. gitlab及jenkins

    1.安装配置gitlab服务,在gitlab新建一个仓库,配置本地密钥,并通过ssh方式拉取gitlab仓库代码 https://packages.gitlab.com/gitlab/gitlab-c ...

  9. mqtt服务搭建(emqx,原emq)

    系统环境: ubuntu 18.04server lts 目标系统IP地址(可访问):192.168.1.31 emqx版本: v3.2.3 打开网页,根据目标系统和emqx版本选择好安装包.这里我选 ...

  10. Kubernetes系统基础

    Kubernetes系统基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.容器编排系统概述 1>.容器编排系统生态圈 Docker通过“镜像”机制极富创造性地解决了应用 ...