LINK:神奇项链

存在两个操作:1. 一个操作可以生成所有形式的回文串 2.一个操作可以将两个串给合并起来 如果前缀和后缀相同还可以将其并起来。

多组询问 每次询问合成一个串所需最少多少次2操作。

不考虑1操作 那么我们可以把所有需要的串都给生成出来 对于原字符串没有贡献的当然是不需要的了。

可以发现 当原字符串有一部分不是回文但是前一部分和后一部分用的同一个地方都成为了回文 此时也是可以进行2操作的。

考虑从前往后构造当前面一部分构造好了后面无论占用前面多大位置都没有问题。

转换成区间覆盖问题。问题是我们要覆盖区间的线段怎么找。原串中的回文串。

可以发现越大越好 对于每个点找到最长的回文串进行区间覆盖问题即可。

PAM解决(忘了 Manacher解决吧。

求出区间之后 可以排序+贪心解决。

当然 可以考虑求出以某个节点为左端的的最长右端点这个复杂度为O(n)也就自然省掉了排序的过程+贪心可以达到O(n).

也可以暴力求出所有区间然后排序。

最后的贪心:可以dp来做 但是需要数据结构优化一下 直接贪心考虑左端点一定往后延伸最长右端点。

const int MAXN=50010;
int n,cnt,id;
int p[MAXN<<1];
char a[MAXN],b[MAXN<<1];
struct wy
{
int x,y;
inline int friend operator <(wy a,wy b){return a.x<b.x;}
}t[MAXN<<1];
inline void manacher()
{
int mx=0,mid=0;
rep(1,cnt,i)
{
if(i<mx)p[i]=min(p[(mid<<1)-i],mx-i);
else p[i]=1;
while(b[i-p[i]]==b[i+p[i]])++p[i];
if(p[i]+i>mx)mx=p[i]+i,mid=i;
}
}
int main()
{
freopen("1.in","r",stdin);
while(~gc(a))
{
n=strlen(a+1);id=0;
b[0]='&';b[cnt=1]='#';
rep(1,n,i)b[++cnt]=a[i],b[++cnt]='#';
manacher();
for(int i=2,j=0;i<=cnt;++i)
{
int ww=p[i]-1;
if(ww)
{
if(i&1)t[++id]=(wy){j-ww/2+1,j+ww/2};
else ++j,t[++id]=(wy){j-ww/2,j+ww/2};
}
}
sort(t+1,t+1+id);
int L=0,flag=1,ans=-1;
while(L<n)
{
int mx=0;
while(t[flag].x<=L+1&&flag<=id)mx=max(t[flag].y,mx),++flag;
L=mx;++ans;
}
put(ans);
}
return 0;
}

bzoj 3790 神奇项链 回文串 manacher|PAM的更多相关文章

  1. BZOJ 3790: 神奇项链 [Manacher 贪心]

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

  2. BZOJ 3790 神奇项链(manacher+贪心)

    3790: 神奇项链 Time Limit: 10 Sec  Memory Limit: 64 MB Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小 ...

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

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

  4. BZOJ 3790 神奇项链(manacher+DP+树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3790 [题目大意] 问最少用几个回文串可以构成给出串,重叠部分可以合并 [题解] 我们 ...

  5. BZOJ 2342 回文串-Manacher

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2342 思路:先跑一遍Manacher求出p[i]为每个位置为中心的回文半径,因为双倍回文串 ...

  6. BZOJ 2565 回文串-Manacher

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2565 题意:中文题 思路:定义L[i],R[i].表示以i为左端点/右端点时,最长回文串长 ...

  7. BZOJ 2565: 最长双回文串 [Manacher]

    2565: 最长双回文串 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1842  Solved: 935[Submit][Status][Discu ...

  8. bzoj 3790 神奇项链(Manacher,DP+BIT | 贪心)

    [题意] 你可以产生一个回文串,也可以将两个串合并成一个串,问产生目标串需要的最少合并次数. [思路] 显然我们要先产生目标串中包含的极大回文字符串. Manacher求出每个位置可以向两边延伸的最长 ...

  9. bzoj 2565: 最长双回文串 manacher算法

    2565: 最长双回文串 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem. ...

随机推荐

  1. Java基础笔记01-02-03-04

    一.今日内容介绍 1.Java开发环境搭建 2.HelloWorld案例 3.注释.关键字.标识符 4.数据(数据类型.常量) 01java语言概述 * A: java语言概述 * a: Java是s ...

  2. linux环境下安装 openOffice4并启动服务

    一.背景故事 openOffice是用来做office文档在线预览功能,把office文档转换成pdf交给前端显示. 之前系统开发过程一直没有将springboot服务怼上服务器,所以只安装了wind ...

  3. Django---进阶7

    目录 图书管理的图书增删改查 choices参数(数据库字段设计常见) MTV与MVC模型 多对多三种创建方式 Ajax 小例子 作业 图书管理的图书增删改查 from django.shortcut ...

  4. SpringBoot+Mybatis一级缓存和二级缓存详解

    本文主要介绍在SpringBoot项目中如何使用Mybatis的一级.二级缓存,为了演示方便,本文的数据库采用H2内存数据库,数据库连接池默认使用SpringBoot2.X自带的hikariCP. 正 ...

  5. Java实现上传文件到指定服务器指定目录(ChannelSftp实现文件上传下载)

    package com.tianyang.task.utils; import java.io.File;import java.io.FileInputStream;import java.io.I ...

  6. Dynamics CRM Data Encrytion error

    Dynamics CRM有两个Database,一个Content DB——xxxx_MSCRM,一个Config DB——MSCRM_CONFIG. 当Content DB从其他环境Restore回 ...

  7. day35 作业

    服务端 import subprocess import struct import json from socket import * server = socket(AF_INET, SOCK_S ...

  8. ADB-常见命令使用详解

    ADB命令使用详解 ADB是一个 客户端-服务器端 程序, 其中客户端是你用来操作的电脑, 服务器端是android设备. 1.连接android设置adb connect 设备名例如:adb con ...

  9. (6)webpack使用babel插件的使用

    为什么要使用babel插件? 首先要了解babel插件是干嘛的,随着js的语法规范发展,出现了越来越多的高级语法,但是使用webpack打包的时候,webpack并不能全部理解这些高级语法,需要我们使 ...

  10. 状态模式(c++实现)

    状态模式 目录 状态模式 模式定义 模式动机 UML类图 源码实现 优点 缺点 模式定义 状态模式(state),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 模式动机 状 ...