观察发现,这道题目其实就相当于一个最小区间覆盖问题
这里的区间是指以每个点为中心的最长回文串
很久没写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. sql if

    SELECT a.id, a.EduSiteNo, a.EduSiteName, a.SchoolId, a.LinkMan, a.Tel, a.Mobile, a.Fax, a.Address, C ...

  2. Python教程:操作数据库,MySql的安装详解

    各位志同道合的同仁请点击上方关注 本教程是基于Python语言的深入学习.本次主要介绍MySql数据库软件的安装.不限制语言语法,对MySql数据库安装有疑惑的各位同仁都可以查看一下. 如想查看学习P ...

  3. 容易被忽略的两个方法:onSaveInstanceState()和onRestoreInstanceState()

    onSaveInstanceState()和onRestoreInstanceState()两个方法,在Activity中是比较容易忽视的方法,但是不得不说还是比较好用的方法,onSaveInstan ...

  4. Javascript基础学习(3)_对象和数组

    一.对象是一种无序的属性集合,每个属性都有自己的名字和值. 1.创建对象 花括号内逗号分隔 var person = { "Name" : "LiCheng", ...

  5. Android - Unable to execute dex: Multiple dex files define

    这种提示的意思是说,引用的文件重复了.在引用json解析库中,clean工程的时候,报错说: Unable to execute dex: Multiple dex files define Lorg ...

  6. 生产者与消费者(二)---await与 signal

    前面阐述了实现生产者与消费者问题的一种方式:wait() / notify()方法,本文继续阐述多线程的经典问题---生产者与消费者的第二种方式:await() / signal()方法. await ...

  7. python 计算apache进程占用的内存大小以及占物理内存的比例

      目的:计算所有apache进程占用的内存大小以及占物理内存的比例: 思路:利用系统中/proc/meminfo的现有数据进行统计 1.pidof列出服务对应进程的PID [root@yanglih ...

  8. 中文版Chrome浏览器不支持12px以下字体的解决方案

    中文版Chrome浏览器不支持12px以下字体的解决方案 Chrome 27之前的中文版桌面浏览器会默认设定页面的最小字号是12px,英文版则没有限制,主要是因为chrome认为汉字小于12px就会增 ...

  9. C语言笔记(二维数组与数值指针)

    一.关于二维数组和二维数组区别 (1)一维数组在内存中是连续分布存储的,同样,二维数组也是在内存连续存储的.所以从内存的角度来分析,一维数组和二维数组其实没有本质区别. (2) 二维数组可以使用一维数 ...

  10. APCS

    arm汇编程序中,R0,R1,R2,R3,R12都是作为中间寄存器,而R4-R11是不能随便使用的,暂时我还不知它们的用途.所以,中间寄存器,在程序运行的开始处与结束的时候值是可以不一样的,也就是说中 ...