\(\text{Problem}\)

给出一个项链,删去连续的一部分,使剩下的对称,且长度最长

\(\text{Analysis}\)

可以发现,剩下的合法项链一定是由两个回文串接起来(由对称性质可知)

先套路地将项链倍长

那么我们只要用 \(\text{Manacher}\) 算出以每个点中心的回文半径 \(p[i]\)

找到两个中心 \(i,j(j > i)\) 使得 \(j - i \le n\) 且 \(i + p[i] - 1 \le j - p[j] + 1\)

\(n\) 为读入的串的长度

枚举一个 \(i\),动态确定一个决策集合,线段树维护最优解即可

注意一个细节,线段树维护的时候一个位置可能加入多个值,这些都是可行的,但删除的时候会使所有的值消失,需要特别处理

\(O(n \log n)\)

但还有扫描线+并查集 \(o(n \alpha(n))\) 的优秀解法(不会)

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; const int N = 2e5 + 5;
int p[N << 1], n, len, bz[N << 1];
char s[N], str[N << 1]; void Manacher()
{
str[0] = '@', str[++n] = '#';
scanf("%s", s);
len = strlen(s);
for(register int i = 0; i < len; i++) str[++n] = s[i], str[++n] = '#';
for(register int i = 0; i < len; i++) str[++n] = s[i], str[++n] = '#';
str[++n] = '\0', len = len * 2;
int mx = 0, id = 0;
for(register int i = 1; i <= n; i++)
{
p[i] = (i < mx ? min(p[id * 2 - i], mx - i) : 1);
while (i - p[i] + len > i + p[i] && str[i + p[i]] == str[i - p[i]]) ++p[i];
if (i + p[i] > mx) mx = i + p[i], id = i;
}
} #define ls (p << 1)
#define rs (ls | 1)
int seg[N * 8];
void update(int p, int l, int r, int x, int v)
{
if (l == r)
{
bz[v] = 1, seg[p] = v;
return;
}
int mid = (l + r) >> 1;
if (x <= mid) update(ls, l, mid, x, v);
else update(rs, mid + 1, r, x, v);
seg[p] = max(seg[ls], seg[rs]);
}
int query(int p, int l, int r, int x, int y)
{
if (x <= l && r <= y) return seg[p];
int mid = (l + r) >> 1, res = 0;
if (x <= mid) res = query(ls, l, mid, x, y);
if (y > mid) res = max(res, query(rs, mid + 1, r, x, y));
return res;
} int Solve()
{
int ans = 0; len >>= 1;
for(register int i = 1; i <= len + 1; i++) update(1, 0, n, i - p[i] + 1, i);
for(register int i = 1; i <= n - len; i++)
{
ans = max(ans, query(1, 0, n, 0, i + p[i] - 1) - i);
if (!bz[i]) update(1, 0, n, i - p[i + 1] + 1, 0);
update(1, 0, n, i + 1 + len - p[i + 1 + len] + 1, i + 1 + len);
}
return ans;
} int main()
{
Manacher();
printf("%d\n", Solve());
}

JZOJ 4366. 【GDKOI2016】项链的更多相关文章

  1. BZOJ1878[SDOI2009]HH的项链

    Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...

  2. bzoj 3202: [Sdoi2013]项链

    Description 项链是人体的装饰品之一,是最早出现的首饰.项链除了具有装饰功能之外,有些项 链还具有特殊显示作用,如天主教徒的十字架链和佛教徒的念珠. 从古至今人们为了美化人体本身,也美 化环 ...

  3. bzoj 4330: JSOI2012 爱之项链

    听说这题不公开.. 那就不贴题意了 首先要用burnside引理求出戒指的种数,那么对于一个顺时针旋转$k$个位置的置换就相当于连上一条$(i,(i+k)%R)$的边,每个环颜色必须相同 环的个数为$ ...

  4. BZOJ 1878: [SDOI2009]HH的项链

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3548  Solved: 1757[Submit][Statu ...

  5. ZZULI 1876: 蛤玮的项链 Hash + 二分

    Time Limit: 6 Sec  Memory Limit: 128 MBSubmit: 153  Solved: 11 SubmitStatusWeb Board Description 蛤玮向 ...

  6. BZOJ1493 [NOI2007]项链工厂

    未完待续... 终于改对了 热泪盈眶.jpg 错误原因:pushdown的时候没有判断是否有左右儿子,也没当x=0 return,于是出现一些奇怪的错误 #include<bits/stdc++ ...

  7. [题解]vijos & codevs 能量项链

    a { text-decoration: none; font-family: "comic sans ms" } .math { color: gray; font-family ...

  8. NOIP2006能量项链[环形DP]

    题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...

  9. [USACO1.1]坏掉的项链Broken Necklace

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  10. 【BZOJ-3790】神奇项链 Manacher + 树状数组(奇葩) + DP

    3790: 神奇项链 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 304  Solved: 150[Submit][Status][Discuss] ...

随机推荐

  1. 【敏捷研发系列】前端DevOps流水线实践

    作者:胡骏 一.背景现状 软件开发从传统的瀑布流方式到敏捷开发,将软件交付过程中开发和测试形成快速的迭代交付,但在软件交付客户之前或者使用过程中,还包括集成.部署.运维等环节需要进一步优化交付效率.因 ...

  2. 多种方法实现单例模式 pickle模块

    目录 单例模式 类方法@classmethod实现 元类实现 模块实现 装饰器实现 双下call.反射实现 pickle序列化模块 单例模式 比如系统调用打印机,不管你要打印几次,都是调用同一个打印机 ...

  3. 基于.NetCore开发博客项目 StarBlog - (23) 文章列表接口分页、过滤、搜索、排序

    前言 上一篇留的坑,火速补上. 在之前的第6篇中,已经有初步介绍,本文做一些补充,已经搞定这部分的同学可以快速跳过,基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列 ...

  4. vue后退页面刷新数据和缓存数据

    我们在项目中经常使用this.$router.go(-1)  但是,有时我们需要把前一个页面的数据进行缓存,有时需要刷新数据,下面来记录一下怎么操作吧 首先:在vue项目中缓存页面我们能想到 keep ...

  5. UVA439 Knight Moves

    原题Vjudge 题目大意 有一个骑士,他可以骑马日字型跳跃,问他从A点到B点最少要几步 解题思路 这题就是一个特别裸的广搜板子 它的主要问题在于输入输出 输入的数据我们可以用\(pair\)读入,第 ...

  6. 【译】2022 年回顾:Web 性能有哪些新变化?

    原文地址:https://www.debugbear.com/blog/2022-in-web-performance 若对文中提到的一些性能参数不太熟悉,可以参考我之前的一篇博文<性能参数和优 ...

  7. 痞子衡嵌入式:探讨i.MXRT下FlexSPI driver实现Flash编程时对于中断支持问题

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT下FlexSPI driver实现Flash编程时对于中断支持问题. 前段时间有客户在官方社区反映 i.MXRT1170 下 ...

  8. [常用工具] Caffe ssd常见问题集合

    1 Check failed: a <= b <0 vs -1.19209e-007> 网上办法是注释掉 CHECK_LE(a, b),但是这样会出大问题.解决办法见2. 如果注释掉 ...

  9. 《STL源码剖析》STL迭代器分类

    input迭代器:只能向前移动,一次一步,用户只能读取,不能修改它们所指向的东西,而且只能读取一次. output迭代器情况类似,但一切只为输出:它们只能向前移动,一次一步,用户只可以修改它们所指向的 ...

  10. MySQL 日期函数、时间函数在实际场景中的应用

    整理日常业务中用到日期函数的一些场景,并对日期函数按照使用类型做了分类,实例也尽可能符合日常需求.为了方便查阅,可以先看目录,再根据需要看具体方法和实例. 首先明确日期和时间类型有哪些,也就是日期函数 ...