后缀数组+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]的更多相关文章

  1. BZOJ 3676 [Apio2014]回文串 (后缀自动机+manacher/回文自动机)

    题目大意: 给你一个字符串,求其中回文子串的长度*出现次数的最大值 明明是PAM裸题我干嘛要用SAM做 回文子串有一个神奇的性质,一个字符串本质不同的回文子串个数是$O(n)$级别的 用$manach ...

  2. BZOJ 3676: [Apio2014]回文串 后缀自动机 Manacher 倍增

    http://www.lydsy.com/JudgeOnline/problem.php?id=3676 过程很艰难了,第一次提交Manacher忘了更新p数组,超时,第二次是倍增的第0维直接在自动机 ...

  3. URAL 1297 最长回文子串(后缀数组)

    1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB The “U.S. Robots” HQ has just received a ...

  4. HDU 3613 Best Reward(KMP算法求解一个串的前、后缀回文串标记数组)

    题目链接: https://cn.vjudge.net/problem/HDU-3613 After an uphill battle, General Li won a great victory. ...

  5. BZOJ3676: [Apio2014]回文串(SAM+Manacher/PAM)

    Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行 ...

  6. 【BZOJ 3676】 3676: [Apio2014]回文串 (SAM+Manacher+倍增)

    3676: [Apio2014]回文串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2343  Solved: 1031 Description 考 ...

  7. 1154 回文串划分(DP+Manacher)

    1154 回文串划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式. ...

  8. 【2018.07.28】(字符串/回文串)学习Manacher算法小记

    主要是应用在回文串啦,原理也理解了老半天,如果没有图片的话,我也看不太懂它的原理 学习的灵感来源来自于:https://segmentfault.com/a/1190000008484167 /* 最 ...

  9. Ural1297 最长回文子串(后缀数组+RMQ)

    /* 源程序丢失QWQ. 就不粘代码了. 大体做法是把串反转然后连接. 做一遍后缀数组. 对height做一遍rmq. 然后对于每个位置的奇偶分别判断, 记下pos. 注意求的是[l+1,r]的hei ...

随机推荐

  1. AD9850驱动程序--MSP430版本

    前段时间忙着画板子搞运放搞滤波了,程序更新的少,发现MSP430不是太好用,尤其Timer,不过也与我使用内部晶振有关,产生正玄波之前用MSP430发出PWM,再进行滤波变为正弦波太麻烦了,这次改用D ...

  2. ubuntu16.04 Flume 安装

    Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并 ...

  3. codevs2503失恋28天......(背包dp)

    503 失恋28天-缝补礼物  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold   题目描述 Description 话说上回他给女孩送了n件礼物,由于是廉价的所以 ...

  4. [Swift通天遁地]四、网络和线程-(5)解析网络请求数据:String(字符串)、Data(二进制数据)和JSON数据

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. ACM_滚动AC

    滚动AC Time Limit: 2000/1000ms (Java/Others) Problem Description: 小光最近拉了几个同学入ACM的坑,为鼓励A题,就增加奖励制度:每AC三道 ...

  6. 组合的json文件分隔或者拆分

    一个txt文件,内部的json格式如下: { "名称": "#pagecontainer > div.main > div.app-msg > div. ...

  7. 6.10---mybatis中两张表查询数据dao层

  8. bootstrap 字体颜色 对齐方式

    一:字体代码:作用--颜色 1..text-muted:提示--浅灰色 2..text-primary:主要--蓝色 3..text-success:成功--浅绿色 4..text-info:     ...

  9. mysql和java的时间对应关系

    引用:http://blog.csdn.net/xinghuo0007/article/details/51500923 MySQL(版本:5.1.50)的时间日期类型如下: datetime 8by ...

  10. Android项目实战_手机安全卫士流量统计

    ## 1.抽屉控件SlidingDrawer:一定要配置android:handle(把手)和android:content(内容),并在子View中添加把手和内容的布局```java <Sli ...