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. 使用centos8搭建僵尸毁灭工程(PZ)服务器

    自从领到了阿里云的ECS服务器后,本着既能熟悉linux操作,又能为喜欢的游戏搭建一个可以和朋友一起联机的服务器(游戏提供自建本地服务器极渣)的想法.作为linux小白的我翻遍了网上的资料,用了五天终 ...

  2. Numerical Sequence(hard version),两次二分

    题目: 题意: 已知一个序列: 112123123412345123456123456712345678123456789123456789101234567891011... 求这个序列第k个数是多 ...

  3. hdu 4352 XHXJ's LIS 数位DP+最长上升子序列

    题目描述 #define xhxj (Xin Hang senior sister(学姐))If you do not know xhxj, then carefully reading the en ...

  4. 【Flutter 实战】动画核心

    老孟导读:动画系统是任何一个UI框架的核心功能,也是开发者学习一个UI框架的重中之重,同时也是比较难掌握的一部分,下面我们就一层一层的揭开 Flutter 动画的面纱. 任何程序的动画原理都是一样的, ...

  5. HashMap等集合初始化时应制定初始化大小

    阿里巴巴开发规范中,推荐用户在初始化HashMap时,应指定集合初始值大小. 一.原因 这个不用多想,肯定是效率问题,那为什么会造成效率问题呢? 当我们new一个HashMap没有对其容量进行初始化的 ...

  6. Newbe.Claptrap 框架入门,第一步 —— 创建项目,实现简易购物车

    让我们来实现一个简单的 “电商购物车” 需求来了解一下如何使用 Newbe.Claptrap 进行开发. 业务需求 实现一个简单的 “电商购物车” 需求,这里实现几个简单的业务: 获取当前购物车中的商 ...

  7. js数组算法题01

    题目:随机生成一个长度为 10 的整数类型的数组,例如 [2, 10, 3, 4, 5, 11, 10, 11, 20],将其排列成一个新数组,要求新数组形式如下,例如 [[2, 3, 4, 5], ...

  8. python 并发专题(十二):基础部分补充(四)协程

    相关概念: 协程:一个线程并发的处理任务 串行:一个线程执行一个任务,执行完毕之后,执行下一个任务 并行:多个CPU执行多个任务,4个CPU执行4个任务 并发:一个CPU执行多个任务,看起来像是同时执 ...

  9. ICP备案业务中取消接入和注销网站是什么

    ICP备案业务中取消接入和注销网站是什么 之前给大家介绍了ICP备案业务中的<什么是ICP备案>.<ICP备案类型>.<ICP备案信息基本标准>.<已备案域名 ...

  10. C#中的char和string的使用简介

    char 字符 char代表一个Unicode字符,它是System.Char的别名 char someChar = 'a';//定义了一个字符 char newLine= '\n';//这是一个换行 ...