bzoj3790
观察发现,这道题目其实就相当于一个最小区间覆盖问题
这里的区间是指以每个点为中心的最长回文串
很久没写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的更多相关文章
- 【BZOJ3790】神奇项链 Manacher+贪心
[BZOJ3790]神奇项链 Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字 母组成的字符串,每个小写字母表示一种颜色.为了制作这个项链,小 H ...
- 【BZOJ3790】神奇项链(manacher,树状数组)
题意: 思路:生成一些回文拼起来使生成的段数最小 显然存在一种最优的方案,使生成的那些回文是目标串的极长回文子串 求出对于每个位置的最长回文子串,问题就转化成了: 给定一些已知起始和终止位置的线段,求 ...
- 【BZOJ-3790】神奇项链 Manacher + 树状数组(奇葩) + DP
3790: 神奇项链 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 304 Solved: 150[Submit][Status][Discuss] ...
- BZOJ3790 : 神奇项链
Manacher求出所有极长回文子串后,得到一堆线段,转化成线段覆盖问题 预处理出g[i]表示左端点不超过i的右端点的最大值 贪心地线段覆盖即可 时间复杂度$O(n)$ #include<cst ...
- BZOJ3790神奇项链——manacher+贪心
题目描述 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字 母组成的字符串,每个小写字母表示一种颜色.为了制作这个项链,小 H 购买了两个机器.第一个机器可以生成所有形式 ...
- BZOJ3790:神奇项链(Manacher)
Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字 母组成的字符串,每个小写字母表示一种颜色.为了制作这个项链,小 H 购买了两个机器.第一个机器可 ...
- BZOJ3790:神奇项链
浅谈\(Manacher\):https://www.cnblogs.com/AKMer/p/10431603.html 题目传送门:https://lydsy.com/JudgeOnline/pro ...
- bzoj3790 manacher算法+贪心
紧跟jk大佬的步伐 这道题哇 因为机器一能生成回文串 所以我们只要用manacher跑一遍求出q[i]这样就把问题转化成了类似线段覆盖的题目 贪心就好了 至于,BIT优化dp我不会所以直接贪心了 注意 ...
- manacher(马拉车)算法详解+例题一道【bzoj3790】【神奇项链】
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=39091399 (CSDN好像有bug,不知道为什 ...
随机推荐
- Windows Python 2.7 安装 Numpy
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4846093. ...
- HTML 转义字符
在HTML中,一个包含特殊字符(如<>&)的字符串,要显示在页面上,由于添加到文本节点时会被认为是HTML的标签结构,造成一些错误,因此,要将这些特殊字符进行转义. 例如在< ...
- (转)javascript中的this
JavaScript中的this总是让人迷惑,应该是js众所周知的坑之一. 个人也觉得js中的this不是一个好的设计,由于this晚绑定的特性,它可以是全局对象,当前对象,或者…有人甚至因为坑大而不 ...
- Intent.Action
1 Intent.ACTION_MAIN String: android.intent.action.MAIN 标识Activity为一个程序的开始.比较常用. Input:nothing Outpu ...
- ios专题 -线程互斥与同步
[原创]http://www.cnblogs.com/luoguoqiang1985 今天遇见了这问题,决定要需要讨论下. 线程同步的方法: @synchronized 官方文档解释:The @syn ...
- Winfroms---看看吧客官~
假 如 你 的 人 生 有 理 想,那 么 就 一 定 要 去 追,不 管 你 现 在 的 理 想 在 别 人 看 来是 多 么 的 可 笑 , 你 也 不 用 在 乎 , 人 生 蹉 跎 几 十 年 ...
- Best Time to Buy and Sell Stock III 解题思路
题目要求: 最多交易两次,并且只能买卖完之后再买. 总思路: 在数组中找一个适当的点i,使得i左右两边profit之和最大. 思路: 1.从左往右扫描,left[i]记录包括i元素以内的左部的maxp ...
- 分享一个自己写的基于TP的关系模型(四)
修复分页BUG,原有代码查询到最后一页就一只查询最后一页 $ ? $; $this->maxPage = ceil($this->total/$this->rows); //$thi ...
- php递归数组中的应用
<?php $arr = array(array(1,2), array(3, 4), array(array(5, 6), array(7, 8)));function t($a){ i ...
- hibernate映射
三种方式: 持久化注解 目前开发主流方式 XML配置描述文件(XML deployment descriptor,可以让Hibernate的PO类与JPA实体类兼容,实际中很少用) ...