bzoj 3676: [Apio2014]回文串【后缀自动机+manacher】
用manacher找出本质不同的回文子串放在SAM上跑
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int N=600005;
int n,p[N];
char s[N],c[N];
long long ans;
struct SAM
{
int la,cnt,pos[N],len[N],si[N],sa[N],fa[N],ch[N][27],c[N],f[N][19],de[N];
SAM()
{
la=++cnt;
}
void ins(int c,int id)
{
int p=la,cur=la=++cnt;
len[cur]=len[p]+1;
si[cur]=1;
pos[id]=la;
for(;p&&!ch[p][c];p=fa[p])
ch[p][c]=cur;
if(!p)
fa[cur]=1;
else
{
int q=ch[p][c];
if(len[q]==len[p]+1)
fa[cur]=q;
else
{
int nt=++cnt;
len[nt]=len[p]+1;
memcpy(ch[nt],ch[q],sizeof(ch[q]));
fa[nt]=fa[q];
fa[q]=fa[cur]=nt;
for(;ch[p][c]==q;p=fa[p])
ch[p][c]=nt;
}
}
}
void wk()
{
for(int i=1;i<=cnt;i++)
c[len[i]]++;
for(int i=1;i<=n;i++)
c[i]+=c[i-1];
for(int i=cnt;i>=1;i--)
sa[c[len[i]]--]=i;
for(int i=cnt;i>=1;i--)
si[fa[sa[i]]]+=si[sa[i]];
for(int i=1;i<=cnt;i++)
{
int u=sa[i];
de[u]=de[fa[u]]+1;
f[u][0]=fa[u];
for(int j=1;(1<<j)<=de[u];j++)
f[u][j]=f[f[u][j-1]][j-1];
}
}
void ques(int l,int r)
{
int x=pos[r];
for(int i=18;i>=0;i--)
if(len[f[x][i]]>=r-l+1)
x=f[x][i];
ans=max(ans,1ll*si[x]*(r-l+1));//cerr<<l<<" "<<r<<" "<<si[x]*(r-l+1)<<endl;
}
}sam;
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
for(int i=1;i<=n;i++)
sam.ins(s[i]-'a',i);
sam.wk();
s[0]='+';s[n+1]='*';
int mx=0,id;
for(int i=1;i<=n;i++)
{
if(mx>i)
p[i]=min(mx-i,p[2*id-i-1]);
else
p[i]=0;
while(s[i+p[i]+1]==s[i-p[i]])
{
p[i]++;
sam.ques(i-p[i]+1,i+p[i]);
}
if(p[i]+i>mx)
mx=p[i]+i,id=i;
}
mx=0;
for(int i=1;i<=n;i++)
{
if(mx>i)
p[i]=min(mx-i-1,p[2*id-i]);
else
{
p[i]=1;
sam.ques(i-p[i]+1,i+p[i]-1);
}
while(s[i+p[i]]==s[i-p[i]])
{
p[i]++;
sam.ques(i-p[i]+1,i+p[i]-1);
}
if(p[i]+i>mx)
mx=p[i]+i,id=i;
}
printf("%lld\n",ans);
return 0;
}
bzoj 3676: [Apio2014]回文串【后缀自动机+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维直接在自动机 ...
- bzoj 3676: [Apio2014]回文串 回文自动机
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 844 Solved: 331[Submit][Status] ...
- BZOJ 3676: [Apio2014]回文串
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2013 Solved: 863[Submit][Status ...
- 【BZOJ 3676】 3676: [Apio2014]回文串 (SAM+Manacher+倍增)
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2343 Solved: 1031 Description 考 ...
- 字符串(马拉车算法,后缀数组,稀疏表):BZOJ 3676 [Apio2014]回文串
Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行 ...
- bzoj 3676: [Apio2014]回文串【回文自动机】
回文自动机板子 或者是SAM+manacher+倍增,就是manacher求本质不同回文串(让f++的串),然后在SAM倍增查询对应点出现次数 #include<iostream> #in ...
- ●BZOJ 3676 [Apio2014]回文串
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3676 题解: 后缀数组,Manacher,二分 首先有一个结论:一个串的本质不同的回文串的个 ...
- BZOJ 3676 [Apio2014]回文串(回文树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3676 [题目大意] 考虑一个只包含小写拉丁字母的字符串s. 我们定义s的一个子串t的& ...
随机推荐
- iOS - 系统方法中弃用的关键字的了解 NS_AVAILABLE和NS_DEPRECATED
NS_AVAILABLE_IOS(5_0) 这个方法可以在iOS5.0及以后的版本中使用,如果在比5.0更老的版本中调用这个方法,就会引起崩溃. NS_AVAILABLE(_mac, _ios) ...
- androidstudio Cannot resolve symbol 'xxx'
Android Studio 无法识别同一个 package 里的其他类,将其显示为红色,但是 compile 没有问题.鼠标放上去后显示 “Cannot resolve symbol XXX”,重启 ...
- 2018 11.2 PION模拟赛
期望:100 + 50 + 30 = 180 实际:0 + 50 + 30 =80 期望:100 实际:0 数值有负数,边界应该设为-0x7f 此处 gg /* 期望的分:50+ */ ...
- R-Tree空间索引算法的研究历程和最新进展分析
转自原文 R-Tree空间索引算法的研究历程和最新进展分析,2008 摘要:本文介绍了空间索引的概念.R-Tree数据结构和R-Tree空间索引的算法描述,并从R-Tree索引技术的优缺点对R-Tre ...
- Activiti-5.3工作流引擎-源码解析(流程文档解析)
前面我们通过BPMN20.xsd和Activiti自定义的XML Schema文件初步了解了业务流程模型的定义,那么现在我们来了解一下流程文档的解析过程,这个过程主要是通过代码解析来完成. 代码解析过 ...
- C++ std::tr1::bind使用
1. 简述 同function函数相似.bind函数相同也能够实现相似于函数指针的功能.但却却比函数指针更加灵活.特别是函数指向类 的非静态成员函数时.std::tr1::function 能够对静态 ...
- mysql中“Table ‘’ is read only”的解决办法
之前是在linux下面直接Copy的data下面整个数据库文件夹,在phpMyAdmin里面重新赋予新用户相应权限后,drupal成功连接上数据库.但出现N多行错误提示,都是跟Cache相关的表是‘R ...
- Tomcat和Jetty对WebSocket的支持
公司项目须要,了解了下眼下几种支持WebSocket的框架.曾经用jWebSocket做过一些项目.相对来说.改jWebSocket的源代码略复杂,也不是一天两天能搞定的. 一调研才发现,如今非常多主 ...
- ReLu(修正线性单元)、sigmoid和tahh的比较
不多说,直接上干货! 最近,在看论文,提及到这个修正线性单元(Rectified linear unit,ReLU). Deep Sparse Rectifier Neural Networks Re ...
- HttpWebRequest中的ContentType详解
1.参考网络资源: http://blog.csdn.net/blueheart20/article/details/45174399 ContentType详解 http://www.tuicoo ...