[bzoj3676]回文串[后缀数组+Manacher]
后缀数组+Manacher
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <algorithm> using namespace std; long long Ans;
int A[],B[],U[];
int SA[],*Rank,H[],Tmp[];
int lg2[],ST[][],p[];
char str[]; void Get_H(const int n)
{
int i,j,k=;
for(i=;i<n;H[Rank[i++]]=k)
for(k?k--:k,j=SA[Rank[i]-];str[i+k]==str[j+k];++k);
for(i=;i<=n;++i)lg2[i]=lg2[i>>]+;
for(i=;i<=n;++i)ST[i][]=H[i];
for(j=;(<<j)<=n;++j)
{
for(i=;i+(<<j)-<=n;++i)
{
ST[i][j]=min(ST[i][j-],ST[i+(<<(j-))][j-]);
}
}
return ;
} int Query(const int l,const int r)
{
int temp=lg2[r-l+];
return min(ST[l][temp],ST[r-(<<temp)+][temp]);
} bool cmp(const int * s,const int a,const int b,const int l)
{
return s[a]==s[b] && s[a+l]==s[b+l];
} int* Get_SA(const int n,int m)
{
int i,j,_p,*x=A,*y=B;
for(i=;i<m;++i)U[i]=;
for(i=;i<n;++i)U[x[i]=str[i]]++;
for(i=;i<m;++i)U[i]+=U[i-];
for(i=n-;i>=;--i)SA[--U[x[i]]]=i; for(j=,_p=;_p<n;m=_p,j<<=)
{
for(_p=,i=n-j;i<n;++i)y[_p++]=i;
for(i=;i<n;++i)if(SA[i]>=j)y[_p++]=SA[i]-j;
for(i=;i<n;++i)Tmp[i]=x[y[i]];
for(i=;i<m;++i)U[i]=;
for(i=;i<n;++i)U[Tmp[i]]++;
for(i=;i<m;++i)U[i]+=U[i-];
for(i=n-;i>=;--i)SA[--U[Tmp[i]]]=y[i];
for(swap(x,y),_p=,x[SA[]]=,i=;i<n;++i)
x[SA[i]]=cmp(y,SA[i-],SA[i],j)?_p-:_p++;
}
return x;
} long long Calc(int l,int r,const int n)
{
l=(l-)>>,r=(r-)>>;
int pos=Rank[l],L,R,temp=; L=,R=pos; while(L<R-)
{
int mid=L+((R-L)>>);
if(Query(mid+,pos)>=r-l+)R=mid;
else L=mid;
} temp+=pos-R;
L=pos,R=n+; while(L<R-)
{
int mid=L+((R-L)>>);
if(Query(pos+,mid)>=r-l+)L=mid;
else R=mid;
}
temp+=L-pos;
return (long long)temp*(r-l+);
} void Manacher(const int n)
{
int i,pos=;
for(i=n-;i>=;--i)
{
str[i+i+]=str[i];
str[i+i+]='#';
}
str[]='^';str[n<<|]='#';str[(n+)<<]='$';
for(i=;i<=(n<<|);++i)
{
if(p[pos]+pos>i)
p[i]=min(p[(pos<<)-i],p[pos]+pos-i);
else p[i]=;
while(str[i-p[i]]==str[i+p[i]])
{ if(i+p[i]>p[pos]+pos) Ans=max(Ans,Calc(i-p[i],i+p[i],n)); p[i]++; }
if(pos+p[pos]<i+p[i])pos=i;
} return ;
} int main()
{
int n; scanf("%s",str); n=strlen(str);
Rank=Get_SA(n+,);
Get_H(n);
Manacher(n); printf("%lld",Ans); return ;
}
[bzoj3676]回文串[后缀数组+Manacher]的更多相关文章
- BZOJ 3676 [Apio2014]回文串 (后缀自动机+manacher/回文自动机)
题目大意: 给你一个字符串,求其中回文子串的长度*出现次数的最大值 明明是PAM裸题我干嘛要用SAM做 回文子串有一个神奇的性质,一个字符串本质不同的回文子串个数是$O(n)$级别的 用$manach ...
- BZOJ 3676: [Apio2014]回文串 后缀自动机 Manacher 倍增
http://www.lydsy.com/JudgeOnline/problem.php?id=3676 过程很艰难了,第一次提交Manacher忘了更新p数组,超时,第二次是倍增的第0维直接在自动机 ...
- URAL 1297 最长回文子串(后缀数组)
1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB The “U.S. Robots” HQ has just received a ...
- HDU 3613 Best Reward(KMP算法求解一个串的前、后缀回文串标记数组)
题目链接: https://cn.vjudge.net/problem/HDU-3613 After an uphill battle, General Li won a great victory. ...
- BZOJ3676: [Apio2014]回文串(SAM+Manacher/PAM)
Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行 ...
- 【BZOJ 3676】 3676: [Apio2014]回文串 (SAM+Manacher+倍增)
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2343 Solved: 1031 Description 考 ...
- 1154 回文串划分(DP+Manacher)
1154 回文串划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式. ...
- 【2018.07.28】(字符串/回文串)学习Manacher算法小记
主要是应用在回文串啦,原理也理解了老半天,如果没有图片的话,我也看不太懂它的原理 学习的灵感来源来自于:https://segmentfault.com/a/1190000008484167 /* 最 ...
- Ural1297 最长回文子串(后缀数组+RMQ)
/* 源程序丢失QWQ. 就不粘代码了. 大体做法是把串反转然后连接. 做一遍后缀数组. 对height做一遍rmq. 然后对于每个位置的奇偶分别判断, 记下pos. 注意求的是[l+1,r]的hei ...
随机推荐
- 不使用c的任何库函数 实现字符串到整数的转换 整数到字符串的转换
转载请标明出处:http://www.cnblogs.com/NongSi-Net/p/6805844.html 今天主要总结下:完成编程: 1.除printf函数之外,不用任何c语言库函数,实现将字 ...
- Django-CKeditor使用笔记
1. 安装django-ckeditor $ pip install django-ckeditor 2. 在setting中,添加ckeditor , ckeditor_uploader 到INST ...
- P2924 [USACO08DEC]大栅栏Largest Fence
传送门 反正我是看不出来这题和凸包有什么关系--大佬们是怎么想到的-- 不准确一点的说,本题就是要我们求一个边上点数最多的凸包 我们可以先把所有的边都取出来,然后按极角排序.枚举这个凸包的起点,然后做 ...
- python配置文件编写
from configparser import ConfigParser # 配置类,专门来读取配置文件# 配置文件结尾:.ini .conf .config .properties .xml# 配 ...
- Django day27 认证组件,权限组件()
一:认证组件 1.写一个类 class LoginAuth(): # 函数名一定要叫authenticate,接收必须两个参数,第二个参数是request对象 def authenticate(sel ...
- 乐字节-Java8核心特性实战之函数式接口
什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一 ...
- akka设计模式系列-慎用ask
慎用ask应该是Akka设计的一个准则,很多时候我们应该禁用ask.之所以单独把ask拎出来作为一篇博文,主要是akka的初学者往往对ask的使用比较疑惑. "Using ask will ...
- linux的touch命令
linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. 1.命令格式: touch [选项]... 文件... 2.命令参数: -a ...
- TensorFlow-Gpu环境搭建——Win10+ Python+Anaconda+cuda
参考:http://blog.csdn.net/sb19931201/article/details/53648615 https://segmentfault.com/a/1190000009803 ...
- CSS——精灵图与背景图片定位
精灵图产生背景: 1.网页上的每张图像都需要向服务器发送一次请求才能展现给用户.2.网页上的图像过多时,服务器就会频繁地接受和发送请求,大大降低页面的加载速度.为了有效地减少服务器接受和发送请求的次数 ...