JZOJ 4366. 【GDKOI2016】项链
\(\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】项链的更多相关文章
- BZOJ1878[SDOI2009]HH的项链
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...
- bzoj 3202: [Sdoi2013]项链
Description 项链是人体的装饰品之一,是最早出现的首饰.项链除了具有装饰功能之外,有些项 链还具有特殊显示作用,如天主教徒的十字架链和佛教徒的念珠. 从古至今人们为了美化人体本身,也美 化环 ...
- bzoj 4330: JSOI2012 爱之项链
听说这题不公开.. 那就不贴题意了 首先要用burnside引理求出戒指的种数,那么对于一个顺时针旋转$k$个位置的置换就相当于连上一条$(i,(i+k)%R)$的边,每个环颜色必须相同 环的个数为$ ...
- BZOJ 1878: [SDOI2009]HH的项链
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3548 Solved: 1757[Submit][Statu ...
- ZZULI 1876: 蛤玮的项链 Hash + 二分
Time Limit: 6 Sec Memory Limit: 128 MBSubmit: 153 Solved: 11 SubmitStatusWeb Board Description 蛤玮向 ...
- BZOJ1493 [NOI2007]项链工厂
未完待续... 终于改对了 热泪盈眶.jpg 错误原因:pushdown的时候没有判断是否有左右儿子,也没当x=0 return,于是出现一些奇怪的错误 #include<bits/stdc++ ...
- [题解]vijos & codevs 能量项链
a { text-decoration: none; font-family: "comic sans ms" } .math { color: gray; font-family ...
- NOIP2006能量项链[环形DP]
题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...
- [USACO1.1]坏掉的项链Broken Necklace
题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...
- 【BZOJ-3790】神奇项链 Manacher + 树状数组(奇葩) + DP
3790: 神奇项链 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 304 Solved: 150[Submit][Status][Discuss] ...
随机推荐
- 【Java SE】Day03流程控制语句
一.流程控制(顺序结构) 二.选择结构 1.多分支中case的穿透性 2.switch的括号可以是 基本/引用类型(String.enum枚举) 三.循环结构 for循环结束后内存消失,效率高 四.扩 ...
- 【Java SE进阶】Day13 Stream流、方法引用
〇.总结 Stream流的方法:forEach.filter.map.count.limit.skip.concat(结合之前的Collectors接口) 方法引用:Lambda的其他类方法体相同,如 ...
- 【实时数仓】Day06-数据可视化接口:接口介绍、Sugar大屏、成交金额、不同维度交易额(品牌、品类、商品spu)、分省的热力图 、新老顾客流量统计、字符云
一.数据可视化接口介绍 1.设计思路 后把轻度聚合的结果保存到 ClickHouse 中后,提供即时的查询.统计.分析 展现形式:用于数据分析的BI工具[商业智能(Business Intellige ...
- psutil模块使用(系统监控,性能分析,进程管理)
psutil模块的介绍 在Python中,我们可以使用psutil这个第三方模块去获取信息的信息. psutil模块可以跨平台使用,支持Linux/UNIX/OSX/Windows等,它主要用来做系统 ...
- 小技巧 EntityFrameworkCore 实现 CodeFirst 通过模型生成数据库表时自动携带模型及字段注释信息
今天分享自己在项目中用到的一个小技巧,就是使用 EntityFrameworkCore 时我们在通过代码去 Update-Database 生成数据库时如何自动将代码模型上的注释和字段上的注释携带到数 ...
- JVM常用调优参数
目录 JVM内存模型及常用参数 参数解释 垃圾收集器 Serial收集器(-XX:+UseSerialGC -XX:+UseSerialOldGC) Parallel Scavenge收集器(-XX: ...
- 第一篇:前端基础之HTML
HTML介绍 Web服务本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) sk.listen(5 ...
- 基于Chromium开发的称重软件,集称重、计价、打印于一体,支持耀华、顶尖等多个厂家设备型号
技术方案: 1.运行时使用.Net Framework4.6框架,界面使用WPF与Chromium. 2.上位机与下位机使用串口对接每家设备协议,上位机与UI使用WebSocket通讯. 3.数据库使 ...
- 模型驱动设计的构造块(下)——DDD
3. 领域对象的生命周期 每个对象都有生命周期,如下图所示.对象自创建后,可能会经历各种不同的状态,直至最终消亡--要么存档,要么删除.当然很多对象是简单的临时对象,仅通过调用构造函数来创建,用来做一 ...
- [cocos2d-x]关于定时器
什么是定时器 定时器的作用就是每隔一段时间,就执行一段自定义的动作,比如飞机向前方移动,子弹的移动等等.该函数定义在CCNode头文件中,基本上cocos2dx中所有的东西都能够使用定时器. 定时器的 ...