观察发现,这道题目其实就相当于一个最小区间覆盖问题
这里的区间是指以每个点为中心的最长回文串
很久没写manacher,有点感动
不得不说manacher是一个非常好的算法

 var s:array[..] of char;
c,l,r,f,p:array[..] of longint;
i,j,t,n,m,ans,k,right:longint;
ch:char; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; function lowbit(x:longint):longint;
begin
exit(x and (-x));
end; procedure sort(ll,rr: longint);
var i,j,x,y: longint;
begin
i:=ll;
j:=rr;
x:=r[(ll+rr) shr ];
y:=l[(ll+rr) shr ];
repeat
while (r[i]<x) or (r[i]=x) and (l[i]<y) do inc(i);
while (x<r[j]) or (r[j]=x) and (y<l[j]) do dec(j);
if not(i>j) then
begin
swap(r[i],r[j]);
swap(l[i],l[j]);
inc(i);
j:=j-;
end;
until i>j;
if ll<j then sort(ll,j);
if i<rr then sort(i,rr);
end; function ask(x:longint):longint;
begin
if x= then exit();
ask:=n+;
while x<=n do //因为求的是后缀最小值,事实上只要将查询和修改的范围换一下即可
begin
ask:=min(ask,c[x]);
x:=x+lowbit(x);
end;
end; procedure add(i:longint);
var x:longint;
begin
x:=r[i];
while x> do
begin
c[x]:=min(c[x],f[i]);
x:=x-lowbit(x);
end;
end; begin
while true do
begin
read(ch);
if not((ch>='a') and (ch<='z')) then break;
s[]:='$';
s[]:='#';
m:=;
n:=;
while (ch>='a') and (ch<='z') do
begin
inc(n);
inc(m);
s[m]:=ch;
inc(m);
s[m]:='#'; //将回文串的奇偶转化为一种情况
read(ch);
end;
s[m+]:=' ';
readln;
k:=;
right:=;
t:=;
fillchar(p,sizeof(p),);
for i:= to m do
begin
if right>i then //manacher的核心
p[i]:=min(p[*k-i],right-i)
else p[i]:=;
while s[i+p[i]]=s[i-p[i]] do inc(p[i]);
if p[i]+i>right then
begin
right:=p[i]+i;
k:=i;
end;
if (s[i]='#') and (p[i]=) then continue
else begin
inc(t);
l[t]:=(i-p[i]+) div ;
r[t]:=(i+p[i]-) div ;
end;
end;
sort(,t); //解决区间覆盖问题,右端点排序
ans:=n;
for i:= to n do
c[i]:=n+;
for i:= to t do
begin
f[i]:=ask(l[i]-)+; //以前这个问题我都是用单调队列的,这里写了树状数组,更简明
if r[i]=n then ans:=min(ans,f[i]);
add(i);
end;
writeln(ans-);
end;
end.

bzoj3790的更多相关文章

  1. 【BZOJ3790】神奇项链 Manacher+贪心

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

  2. 【BZOJ3790】神奇项链(manacher,树状数组)

    题意: 思路:生成一些回文拼起来使生成的段数最小 显然存在一种最优的方案,使生成的那些回文是目标串的极长回文子串 求出对于每个位置的最长回文子串,问题就转化成了: 给定一些已知起始和终止位置的线段,求 ...

  3. 【BZOJ-3790】神奇项链 Manacher + 树状数组(奇葩) + DP

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

  4. BZOJ3790 : 神奇项链

    Manacher求出所有极长回文子串后,得到一堆线段,转化成线段覆盖问题 预处理出g[i]表示左端点不超过i的右端点的最大值 贪心地线段覆盖即可 时间复杂度$O(n)$ #include<cst ...

  5. BZOJ3790神奇项链——manacher+贪心

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

  6. BZOJ3790:神奇项链(Manacher)

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

  7. BZOJ3790:神奇项链

    浅谈\(Manacher\):https://www.cnblogs.com/AKMer/p/10431603.html 题目传送门:https://lydsy.com/JudgeOnline/pro ...

  8. bzoj3790 manacher算法+贪心

    紧跟jk大佬的步伐 这道题哇 因为机器一能生成回文串 所以我们只要用manacher跑一遍求出q[i]这样就把问题转化成了类似线段覆盖的题目 贪心就好了 至于,BIT优化dp我不会所以直接贪心了 注意 ...

  9. manacher(马拉车)算法详解+例题一道【bzoj3790】【神奇项链】

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=39091399 (CSDN好像有bug,不知道为什 ...

随机推荐

  1. Android源码编译过程之九鼎开发板

    build_kernel() { # 进入源码顶层目录 cd ${BS_DIR_KERNEL} || # 编译配置文件 make ${BS_CONFIG_KERNEL} ARCH=arm CROSS_ ...

  2. asp.net pagebase获取缓存的方法

    public string GetSysConfigByKey(string key) { if (object.Equals(HttpContext.Current.Cache["Cach ...

  3. A题笔记(10)

    No.1390 代码:https://code.csdn.net/snippets/191965  另一版本:https://code.csdn.net/snippets/192009 考察点有两个: ...

  4. iOS开发进阶--1.多线程简介

    学习是由已知的知识模型推理未知的知识模型的的过程. 本文适合学习完objective-c基础,想进一步提高做iOS开发的同学阅读. 在说线程的时候,我们先看看进程. 1.进程 每一个运行在系统中的应用 ...

  5. wireshark添加用户执行

    默认情况下,访问网络端口需要root权限,而wireshark的只是/usr/share/dumpcap的一个UI,/usr/share/dumpcap需要root权限,所以没法non-root用户无 ...

  6. CSS3实用方法小记 2016.03.16

    圆角边框: border-radius : 4px; box阴影: box-shadow : 5px 5px 3px #000 ; /* 参数分别为向右拓展距离,向下拓展距离,阴影宽度,颜色*/ 背景 ...

  7. jfreechart环形图完美实现

    邮件发送由于不支持js,项目只能在后台生成环形图,用jfreechart完全可以实现,即:RingPlot. 这就拿jfreechart生成的最终效果,依赖jar包jfreechart,如果有任何细节 ...

  8. free() 是如何释放不同内存区块大小的指针?

    最初是在知乎上看到这个问题的C++ delete[] 是如何知道数组大小的?,我也挺好奇,所以就作了一番工作. 申请内存时,指针所指向区块的大小这一信息,其实就记录在该指针的周围看下面这段代码: #i ...

  9. Java面向对象程序设计--与C++对比说明:系列1(面向对象基础)

         面向对象程序设计作为一种重要的程序设计思想,在近些年来得到广泛的推崇.而Java和C++更是面向对象程序设计语言中的翘楚,要彻底摸清面向对象程序设计的精髓和在实际应用中更加高效的进行代码设计 ...

  10. StrongReference

    原创作品:未经本人允许,不得转载前段时间写项目时遇到了一个问题,就是从网络获取图片资源的问题,总是出现OOM异常,经过几天的努力,终于处理的还算是可以使用,OOM的处理一直都是很头疼的问题.对于三级缓 ...