[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 ...
随机推荐
- 手动安装jar包到Maven本地仓库
接手别人的一个项目,Maven工程,导入后,某些jar包找不到,然后从同事那复制Maven本地仓库的文件夹到我的电脑,发现依旧找不到.问题大致总结为:本地maven仓库存在jar,但是依然报Missi ...
- Codeforces 612D 前缀和处理区间问题
传送门:http://codeforces.com/problemset/problem/612/D (转载请注明出处谢谢) 题意: 给出数字n和k,n表示接下来将输入n个在x轴上的闭区间[li,ri ...
- Android从Camera中获取图片的两种方法
方法一: 此方法会由Camera直接产生照片回传给应用程序,但是返回的是压缩图片,显示不清晰 ? 1 2 3 4 5 6 try { Intent cameraIntent = new In ...
- Spring IOC set注入
Hobby.java package com.wh.bean; public class Hobby { private Integer id; private String name; public ...
- ASP.NET 之正则表达式
转载自:http://www.regexlib.com/cheatsheet.htm?AspxAutoDetectCookieSupport=1 Metacharacters Defined MCha ...
- Android 在fragment中实现返回键单击提醒 双击退出
尝试用mvp架构加dagger2来重写了一下,大致功能都实现了,还没有全部完成. 项目地址 接近完成的时候,想在天气信息页面实现一个很常见的功能,也就是点击屏幕下方的返回键的时候不是返回到上一个act ...
- T-SQL语句以及几个数据库引擎
创建表 注意事项: A.自增长 B.数据库引擎, ISAM 是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数.因此,IS ...
- html5——背景
背景大小 background-size: % %;//宽 高 background-size: 100px 100px;//宽 高 background-size: cover;//覆盖,图片会完全 ...
- c++和python如何实现主机字节序和网络字节序的相互转换
在上一篇文章网络编程:主机字节序和网络字节序中,介绍了主机字节序和网络字节序的基本概念以及在实际的编程中,何时需要进行网络字节序和主机字节序的转换.本篇文章着重介绍使用c++和python语言,如何实 ...
- 使用 Spring Social 连接社交网络
Spring Social 框架是spring 提供社交平台的分享组件 https://www.ibm.com/developerworks/cn/java/j-lo-spring-social/