【算法】(manacher+贪心)||(manacher+DP+树状数组/线段树)

【题解】

manacher求回文串,后得到线段,做一点计算映射回原串线段。

然后问题转化为可重叠区间线段覆盖问题,可以贪心解决。

排序左端点,同一左端点取最长段,然后在此段中找到右端点最靠右的线段,线性更新并累加。

DP的话:f[i]表示刚好覆盖1...i的最少线段(即最后一条线段右端点在i上),则按顺序枚举线段a[i],

f[a[i].r]=min(f[j])+1 , j=(a[i].l,a[i].l+1,...,a[i].r-1),显然a[n]为答案。

于是可以用树状数组或线段树来在线维护min(f[j])。

两者复杂度皆为o(n log n)。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=;
int n,p[maxn];
char s[maxn],ss[maxn];
struct cyc{int l,r;}a[maxn];
bool cmp(cyc a,cyc b)
{return a.l<b.l||(a.l==b.l&&a.r>b.r);}
void manacher()
{
memset(p,,*(n+));
int id=,mx=;
for(int i=;i<=n;i++)
{
if(mx>i)
p[i]=min(p[id*-],mx-i+);
else p[i]=;
while(s[i+p[i]]==s[i-p[i]])p[i]++;
if(i+p[i]->mx)
{
mx=i+p[i]-;
id=i;
}
// printf("p[%d]=%d\n",i,p[i]);
if(i%)a[i].l=i/-p[i]/+,a[i].r=i/+p[i]/;
else a[i].l=i/-p[i]/+,a[i].r=i/+p[i]/-;
if(a[i].l>a[i].r)a[i].l=a[i].r=;
}
// for(int i=1;i<=n;i++)printf("%d %d\n",a[i].l,a[i].r);
}
int main()
{
while(scanf("%s",ss+)==)
{
int tot=strlen(ss+);
n=;s[]='$';s[]='#';
for(int i=;i<=tot;i++)s[++n]=ss[i],s[++n]='#';
manacher();
sort(a+,a+n+,cmp);
int right=a[].r,ans=,mx=;
// for(int i=1;i<=n;i++)printf("a[%d]l=%d r=%d\n",i,a[i].l,a[i].r);
for(int i=;i<=n;i++)
if(a[i].l!=a[i-].l)
{
if(a[i].l>right+)ans++,right=mx;
mx=max(mx,a[i].r);
}
if(right<tot)ans++;
printf("%d\n",ans-);
}
return ;
}

贪心

【BZOJ】3790 神奇项链的更多相关文章

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

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

  2. bzoj 3790: 神奇项链

    3790: 神奇项链 Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字 母组成的字符串,每个小写字母表示一种颜色.为了制作这个项链,小 H 购买了 ...

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

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

  4. bzoj 3790 神奇项链 回文串 manacher|PAM

    LINK:神奇项链 存在两个操作:1. 一个操作可以生成所有形式的回文串 2.一个操作可以将两个串给合并起来 如果前缀和后缀相同还可以将其并起来. 多组询问 每次询问合成一个串所需最少多少次2操作. ...

  5. BZOJ 3790 神奇项链 hash/后缀自动机+贪心

    Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字母组成的字符串,每个小写字母表示一种颜色. 为了制作这个项链,小 H 购买了两个机器.第一个机器可 ...

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

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

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

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

  8. BZOJ 3790 神奇项链(回文自动机+线段树优化DP)

    我们预处理出来以i为结尾的最长回文后缀(回文自动机的构建过程中就可以求出)然后就是一个区间覆盖,因为我懒得写贪心,就写了线段树优化的DP. #include<iostream> #incl ...

  9. 【BZOJ】【3790】神奇项链

    Manacher算法/DP 找出所有的回文串,看做是一个个线段,那么问题就转化成了用最少的线段将整个区间覆盖起来,可以重叠,那么这就是一个DP了= = Orz ZKY大爷,让蒟蒻开眼界了……头一次知道 ...

随机推荐

  1. Where to go from here

    Did you get through all of that content? Congratulations! You've learnt the fundamentals of algorith ...

  2. scrapy(1)——scrapy介绍

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说 ...

  3. GPS定位,经纬度附近地点查询–C#实现方法

              摘要:目前的工作是需要手机查找附近N米以内的商户,功能如下图数据库中记录了商家在百度标注的经纬度(如:116.412007,39.947545),最初想法以圆心点为中心点,对半径做 ...

  4. 在intelllij中debug的时候使用log4j输出

    一般在本地调试的时候,在控制台打印输出都会使用system.out.print,但是在线上运行的时候一般都是使用log4j进行日志输出. 那么在编写代码的时候,又不想写两份,直接写LOG是常规动作. ...

  5. jQuery的动画与特效

    显示与隐藏 show() 和 hide() 方法 动画效果的show() 和 hide() show(speed,[]callback) hide(speed,[]callback) speed:表示 ...

  6. BZOJ4737 组合数问题(卢卡斯定理+数位dp)

    不妨不管j<=i的限制.由卢卡斯定理,C(i,j) mod k=0相当于k进制下存在某位上j大于i.容易想到数位dp,即设f[x][0/1][0/1][0/1]为到第x位时是否有某位上j> ...

  7. Python 源码剖析(三)【字符串对象】

    三.字符串对象 1.PyStringObject与PyString_Type 2.创建PyStringObject对象 3.Intern 机制 4.字符缓冲池 5.PyStringObject 效率相 ...

  8. BZOJ1090:[SCOI2003]字符串折叠——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1090 Description 折叠的定义如下: 1. 一个字符串可以看成它自身的折叠.记作S=S 2 ...

  9. SPOJ3267/DQUERY:D-query——题解

    https://vjudge.net/problem/SPOJ-DQUERY http://www.spoj.com/problems/DQUERY/en/ 给定一列数,查询给定区间内数的种类数. 这 ...

  10. Linux 第30天: (08月5日) 练习和作业

    变量脚本 1.编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小 server_ip=`if ...