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,不知道为什 ...
随机推荐
- python 面向对象深入理解
面向过程 函数式编程 面向对象编程:面向对象是由类和对象组成,只要用类和对象实现的,就是面向对象编程 def Bar(): print "This is Bar " ...
- windows系统 安装MongoDB 32位
本篇文章记录了我在win7 32位下安装MongoDB的步骤,以作记录. 下文的安装方法参考了以下博文: http://www.cnblogs.com/lzrabbit/p/3682510.html ...
- ASP.NET MVC ajax提交 防止CSRF攻击
//在View中 <script type="text/javascript"> @functions{ public string ToKenHeaderValue( ...
- 24、Javascript BOM
BOM(Browser Object Model)浏览器对象模型,一组浏览器提供的API. window对象 window对象表示当前浏览器的窗口,是Javascript的顶级对象,所有创建的对象.函 ...
- (转)PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
一.中文截取:mb_substr() mb_substr( $str, $start, $length, $encoding ) $str,需要截断的字符串 $start,截断开始处,起始处为0 $l ...
- Centos6.5 安装 MariaDB-10.0.20-linux-x86_64.tar.gz
下载mariadb :https://downloads.mariadb.org/ 我选择mariadb-10.0.20-linux-x86_64.tar.gz这个版本 复制安装文件 /opt 目录 ...
- Ajax结合Js操作灵活操作表格
Table页面: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head& ...
- Delphi 类方法和普通方法的区别 .
//类声明 TMyClass = class public class procedure MyProc; //类方式 constructor Create; //Crea ...
- Oracle中的rownum,ROWID的 用法
1.ROWNUM的使用——TOP-N分析 使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM. ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的 ...
- 数据库(学习整理)----5--Oracle常用的组函数
其他: 1.oracle中下标是从1开始的,Java下标是从0开始的 函数分类: 日期函数 字符函数 转换函数 数学函数 系统函数 ---在当前月份上面:增加.减少月份 select add_mont ...