bzoj2565
网络流就先告一段落了
在进行其他训练之前,我决定先练一道后缀数组(对这个我还是比较有自信的)
虽然之前没用后缀数组解决过回文问题,但是稍微想想就知道,
要解决最长双倍回文,首先要解决最长回文序列,
要解决最长回文序列,首先要倒序添加原串然后LCP
任意两个后缀的LCP我就不多说了,
然后我们就可以求出以任意一个字符为中心展开的最长回文串(要小心,偶数长度的最长回文串)
然后就能求出每个字符向左向右延伸回文串能延伸多远,
最后在遍历一边就可以了。
var h,sa,rank,x,y,sum:array[..] of longint;
f:array[..,..] of longint;
d:array[..] of longint;
left,right:array[..] of longint;
p,i,j,l,n,m,ans,t:longint;
s:ansistring; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; procedure suffix;
var m,p,i,j:longint;
begin
for i:= to n do
begin
y[i]:=ord(s[i]);
inc(sum[y[i]]);
end;
m:=;
for i:= to m do
inc(sum[i],sum[i-]);
for i:=n downto do
begin
sa[sum[y[i]]]:=i;
dec(sum[y[i]]);
end;
p:=;
rank[sa[]]:=;
for i:= to n do
begin
if y[sa[i]]<>y[sa[i-]] then inc(p);
rank[sa[i]]:=p;
end;
m:=p;
j:=;
while m<n do
begin
y:=rank;
fillchar(sum,sizeof(sum),);
p:=;
for i:=n-j+ to n do
begin
inc(p);
x[p]:=i;
end;
for i:= to n do
if sa[i]>j then
begin
inc(p);
x[p]:=sa[i]-j;
end;
for i:= to n do
begin
rank[i]:=y[x[i]];
inc(sum[rank[i]]);
end;
for i:= to m do
inc(sum[i],sum[i-]);
for i:=n downto do
begin
sa[sum[rank[i]]]:=x[i];
dec(sum[rank[i]]);
end;
p:=;
rank[sa[]]:=;
for i:= to n do
begin
if (y[sa[i]]<>y[sa[i-]]) or (y[sa[i]+j]<>y[sa[i-]+j]) then inc(p);
rank[sa[i]]:=p;
end;
m:=p;
j:=j shl ;
end;
h[]:=;
p:=;
for i:= to n do
begin
if rank[i]= then continue;
j:=sa[rank[i]-];
while s[i+p]=s[j+p] do inc(p);
h[rank[i]]:=p;
if p> then dec(p);
end;
end; procedure rmq;
begin
t:=trunc(ln(n)/ln());
d[]:=;
for i:= to t do
d[i]:=d[i-]*; for i:= to n do
f[i,]:=h[i];
for j:= to t do
for i:= to n do
if (i+d[j]-<=n) then
f[i,j]:=min(f[i,j-],f[i+d[j-],j-]);
end; function ask(x,y:longint):longint;
var k:longint;
begin
if x>y then swap(x,y);
inc(x);
k:=trunc(ln(y-x+)/ln());
ask:=min(f[x,k],f[y-d[k]+,k]);
end; begin
readln(s);
l:=length(s);
s:=s+'*';
for i:=l downto do
begin
s:=s+s[i];
left[i]:=;
right[i]:=;
end;
n:=length(s);
suffix;
rmq;
for i:= to l do
begin
p:=ask(rank[i],rank[n+-i]); //先求奇数长度的回文序列
left[i-p+]:=max(left[i-p+],p*-);
right[i+p-]:=max(right[i+p-],p*-);
if i<>l then
begin
p:=ask(rank[i],rank[n-i]); //偶数长度的回文序列
if p> then dec(p); //细节
if p<> then
begin
left[i-p+]:=max(left[i-p+],*p);
right[i+p]:=max(right[i+p],*p);
end;
end;
end;
for i:=l- downto do //处理每个字符为回文串的一端的最远延伸
right[i]:=max(right[i],right[i+]-);
for i:= to l do
left[i]:=max(left[i],left[i-]-);
for i:= to l- do //不难理解
ans:=max(ans,right[i]+left[i+]);
writeln(ans);
end.
bzoj2565的更多相关文章
- 【BZOJ2565】最长双回文串(回文树)
[BZOJ2565]最长双回文串(回文树) 题面 BZOJ 题解 枚举断点\(i\) 显然的,我们要求的就是以\(i\)结尾的最长回文后缀的长度 再加上以\(i+1\)开头的最长回文前缀的长度 至于最 ...
- 【BZOJ2565】最长双回文串 Manacher
[BZOJ2565]最长双回文串 Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为 ...
- BZOJ2565 最长双回文串 【Manacher】
BZOJ2565 最长双回文串 Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"c ...
- 【BZOJ2565】最长双回文串 (Manacher算法)
题目: BZOJ2565 分析: 首先看到回文串,肯定能想到Manacher算法.下文中字符串\(s\)是输入的字符串\(str\)在Manacher算法中添加了字符'#'后的字符串 (构造方式如下) ...
- 回文自动机(BZOJ2565)
#include <cstdio> #include <cstring> #include <iostream> using namespace std; ][], ...
- bzoj2565: 最长双回文串
manacher之后乱搞 #include <iostream> #include <cstdio> #include <cstring> #include < ...
- BZOJ2565: 最长双回文串(回文树)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2565 记录一下每个点往前最长延伸位置,正反两遍,枚举分割点. #include<cstr ...
- BZOJ2565最长双回文串——manacher
题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两 ...
- 2019.03.02 bzoj2565: 最长双回文串(pam)
传送门 题意简述:问最长的由两个回文串连接而成最长字串长度. 思路: 正反串各建一个pampampam然后就完了. 代码: #include<bits/stdc++.h> #define ...
随机推荐
- oracle创建存储过程并返回结果集(附C#调用代码)
使用存储过程中,最常用的莫过于查询数据表,并返回结果集. 在SQL SERVER 中,这类操作最简单,通过简单的select * from xx 即可完成.但是在Oracle中并不支持这种写法,那么我 ...
- 回溯算法之n皇后问题
今天在看深度优先算法的时候,联想到DFS本质不就是一个递归回溯算法问题,只不过它是应用在图论上的.OK,写下这篇博文也是为了回顾一下回溯算法设计吧. 学习回溯算法问题,最为经典的问题我想应该就是八皇后 ...
- IE兼容性问题
1.H5标签兼容.解决:js:document.createElement("footer");css:display: block;或者直接使用 html5shiv.js ...
- javascript操作html元素CSS属性
下面先记录一下JS控制CSS所使用的方法. 1.使用javascript更改某个css class的属性... <style type="text/css"> .ori ...
- [转]LoadRunner脚本录制常见问题整理
LoadRunner脚本录制常见问题整理 1.LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面 ...
- python特性property
通常,访问类和实例属性的时候,将返回所存储的相关值,也就是直接和类(实例的)的__dict__打交道.若果要规范这些访问和设值方式的话, 一种方法是数据描述符,另一种就是python内置的数据描述符协 ...
- 创建Mysql
CREATE DATABASE IF NOT EXISTS yiya DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
- 【mapping】 springmvc的注解mapping无法生效的问题
springmvc 始终无法加载 注解 map, 解决办法 八月 11, 2015 8:24:42 下午 org.springframework.web.servlet.DispatcherServl ...
- JAVA程序性能分析及调优浅析
1.性能分析本质 寻找系统的性能瓶颈(木桶理论/短板效应),并处理系统的性能瓶颈 2.性能分析主要指标负载.响应和服务器CPU\MEM等的使用率 3.性能分析主要工具 LoadRunner Visua ...
- Mongodb介绍
MongoDB 是一个高性能,开源,无模式的文档型数据库,是当前noSql数据库产品中最热门的一种.它在许多场景下用于替代传统的关系型数据库或键值对存储方式,MongoDB是用C++开发,MongoD ...