bzoj 3790 神奇项链 回文串 manacher|PAM
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的更多相关文章
- BZOJ 3790: 神奇项链 [Manacher 贪心]
3790: 神奇项链 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 405 Solved: 200[Submit][Status][Discuss] ...
- BZOJ 3790 神奇项链(manacher+贪心)
3790: 神奇项链 Time Limit: 10 Sec Memory Limit: 64 MB Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小 ...
- BZOJ.2565.[国家集训队]最长双回文串(Manacher/回文树)
BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长 ...
- BZOJ 3790 神奇项链(manacher+DP+树状数组)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3790 [题目大意] 问最少用几个回文串可以构成给出串,重叠部分可以合并 [题解] 我们 ...
- BZOJ 2342 回文串-Manacher
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2342 思路:先跑一遍Manacher求出p[i]为每个位置为中心的回文半径,因为双倍回文串 ...
- BZOJ 2565 回文串-Manacher
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2565 题意:中文题 思路:定义L[i],R[i].表示以i为左端点/右端点时,最长回文串长 ...
- BZOJ 2565: 最长双回文串 [Manacher]
2565: 最长双回文串 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1842 Solved: 935[Submit][Status][Discu ...
- bzoj 3790 神奇项链(Manacher,DP+BIT | 贪心)
[题意] 你可以产生一个回文串,也可以将两个串合并成一个串,问产生目标串需要的最少合并次数. [思路] 显然我们要先产生目标串中包含的极大回文字符串. Manacher求出每个位置可以向两边延伸的最长 ...
- bzoj 2565: 最长双回文串 manacher算法
2565: 最长双回文串 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem. ...
随机推荐
- pycharm连接远程服务器(拉取版本)
pycharm连接远程服务器(拉取版本) 有这篇教程是因为,博主有两个办公地点,想着在办公地点A上传代码到服务器并调试,并在B时候可以拉取这份代码,并进行调试.因此有这篇拉取版本的博客,之前还有上传版 ...
- [设计模式]工厂方法模式(Factory Method)
模式目的 定义一个用于创建对象的接口,让其子类来决定实例化哪个类. 工厂方法模式将类的实例化延迟到了子类中进行. 模式结构 组成部分 产品(Product) - 定义了产品功能的接口 具体产品(Con ...
- Report.Net 本地数据库、WebService、Socket报表
本地.服务器的Access.Sql报表编辑.预览.打印. 可自定义预览界面,可方便嵌入到你的程序中去,提供接口函数,如有需要可自行添加接口. 预览采用单双面方式,因为如果页面过多,预览不能全部加载,所 ...
- day67 前后端数据交互
目录 一.前后端传输数据的编码格式(contentType) 1 form表单 2 ajax请求 二.ajax发送json格式数据 三.ajax发送文件 四.django自带的序列化组件(drf做铺垫 ...
- for循环与嵌套(水仙花数与三角形的打印)
## 一.for循环语法:for(开始区间: 结束区间; 修改循环条件){ 循环体:} > 开始区间:初始化表达式(确定开始)int i = 1; > 结束区间:逻辑表达式(确定结束) i ...
- javascript基础(五): jQuery
jQuery javaScript和jQuery的关系? jQuery库,里面存在大量的JavaScript函数 获取jQuery 公式:$(selector).action() <!DOCT ...
- CMDB02/ 单例模式、资产采集参考命令、日志处理
CMDB02/单例模式.资产采集参考命令.日志处理 目录 CMDB02/单例模式.资产采集参考命令.日志处理 1. 单例模式 1.1 多例模式 1.2 单例模式 1.2.1 单例模式/错误 1.2.2 ...
- 数据可视化之PowerQuery篇(三)学会使用PowrQuery的自定义函数
https://zhuanlan.zhihu.com/p/64415763 使用Power Query进行复杂一些的数据处理,离不开M函数,目前已经有超过700个函数了,基本上各式各样的数据处理需求都 ...
- 网页排名算法PagaRank
网页排名算法PageRank PageRank,网页排名,又叫做网页级别.是一种利用网页之间的超链接数据进行计算的方法.它是由Google的两位创始人提出的. 对于用户而言,网页排名一般是比较主观的, ...
- Python Ethical Hacking - Malware Analysis(4)
DOWNLOAD_FILE Download files on a system. Once packaged properly will work on all operating systems. ...